我想了解更多判斷陣列的方式

蝸牛的北極星之旅發表於2019-12-11

9021年底了,突然想在這個最後一個月準備一下,試試機會,能否更進一步。所以開始準備一些基礎知識,也隨帶總結出來給各位想換工作的同學。希望大家能找到自己想要的工作。祝大家好運!

如果你知道更多的方式評論給我。謝謝!

總結回顧

一、instanceof

var array = [];
array instanceof Array;
複製程式碼

PS:instanceof的實現原理(判斷左邊物件的原型鏈上是否存在右邊原型)

function myInstanceof(left, right) {
    let right = right.prototype;
    let left = left.__proto__;
    while (true) {
        if (left === null || rigth === undefined) {
            return false;
        } else {
            if (left === right) {
                return true;
            } else {
                left = left.__proto__;
            }
        }
    }
}
複製程式碼

二、constructor

var array = [];
array.constructor === Array
複製程式碼

PS:instanceof和constructor判斷的變數,必須在當前頁面申明的,比如,一個頁面(父頁面)一樣一個框架,框架中引入一個頁面(子頁面),在子頁面中宣告的array,並將其複製給父元素的一個變數,判斷該變數,將返回false。

原因:array是複合型別。在傳遞的過程中,僅僅是引用地址的傳遞。 每個頁面的array原生物件引用的地址是不一樣的,在子頁面中宣告的array,所對應的建構函式,是子頁面的array物件,在父頁面進行判斷時,使用的並不是子頁面的array;

三、__ proto__.constructor

var array = [];
array.__proto__.constructor === Array;
複製程式碼

每個物件都有一個__proto__屬性,該屬性指向建構函式的原型物件,物件可以通過這個屬性訪問到建構函式的原型物件,__proto__屬性是沒有寫入ES6正文的屬性, 而是寫入了附錄中,原因是他本質上是一個內部屬性,而不是一個正式的API,只是被瀏覽器廣泛支援,才被加入ES6,只有瀏覽器有這個屬性,其他環境是沒有。所以重某種角度來說,我們是不建議在實際生產中使用的,而是使用Object.getPrototypeOf(target)來進行操作。

var array = [];
Object.getPrototypeOf(array).constructor === Array;
複製程式碼

四、Array.isArray

var array = [];
Array.isArray(array);
複製程式碼

es6中加入了新的判斷方法,存在相容性問題。

五、toString(最常用)

考慮Array.isArray的相容性問題

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

}
var array = [];
Array.isArray(array);
複製程式碼

相關文章