instanceof詳解(判斷是數組嗎)—— 判斷是否是數組和對象原型的實例


instanceof詳解

 
instanceof (A,B) = { var L = A.__proto__; var R = B.prototype; if(L === R) { //A的內部屬性__proto__指向B的原型對象 return true; } return false; } 

我們再來看幾個例子:

[] instanceof Array; //true {} instanceof Object;//true new Date() instanceof Date;//true function Person(){}; new Person() instanceof Person; [] instanceof Object; //true new Date() instanceof Object;//true new Person instanceof Object;//true 

我們發現,雖然 instanceof 能夠判斷出 [ ] 是Array的實例,但它認為 [ ] 也是Object的實例,從 instanceof 能夠判斷出 [ ].proto 指向 Array.prototype,而 Array.prototype.proto 又指向了Object.prototype,最終 Object.prototype.proto 指向了null,標志着原型鏈的結束。因此,[]、Array、Object 就在內部形成了一條原型鏈.

從原型鏈可以看出,[] 的 proto 直接指向Array.prototype,間接指向 Object.prototype,所以按照 instanceof 的判斷規則,[] 就是Object的實例。依次類推,類似的 new Date()、new Person() 也會形成一條對應的原型鏈 。因此,instanceof 只能用來判斷兩個對象是否屬於實例關系, 而不能判斷一個對象實例具體屬於哪種類型。

instanceof 操作符的問題在於,它假定只有一個全局執行環境。如果網頁中包含多個框架,那實際上就存在兩個以上不同的全局執行環境,從而存在兩個以上不同版本的構造函數。如果你從一個框架向另一個框架傳入一個數組,那么傳入的數組與在第二個框架中原生創建的數組分別具有各自不同的構造函數。

為了解決這個問題, ECMAScript 5 新增了 Array.isArray() 方法。這個方法的目的是最終確定某個值到底是不是數組,而不管它是在哪個全局執行環境中創建的。

支持 Array.isArray()方法的瀏覽器有 IE9+、 Firefox 4+、 Safari 5+、 Opera 10.5+和 Chrome。

當檢測Array實例時, Array.isArray 優於 instanceof,因為Array.isArray能檢測iframes.

var iframe = document.createElement('iframe'); document.body.appendChild(iframe); xArray = window.frames[window.frames.length-1].Array; var arr = new xArray(1,2,3); // [1,2,3] // Correctly checking for Array Array.isArray(arr); // true // Considered harmful, because doesn't work though iframes arr instanceof Array; // false 

假如不存在 Array.isArray(),則在其他代碼之前運行下面的代碼將創建該方法。

if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; }

 

A instanceof B ,返回值為boolean類型,用來判斷A是否是B的實例對象或者B子類的實例對象。如果是則返回true,否則返回false。
如:Person p = new Person() ; //
Man m = new Man() ; //Man是Person的子類
Animal a = new Animal() ;
m instanceof Man //返回true
m instanceof Animal//返回false
m instanceof Person//返回true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM