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);
複製程式碼