1. 程式人生 > 其它 >instanceof詳解(判斷是陣列嗎)—— 判斷是否是陣列和物件原型的例項

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