前端開發(fā)『巨坑』系列—類數(shù)組詳解

這個數(shù)據(jù)好像不是數(shù)組


當后臺給我們傳遞了一個數(shù)組,我們正好來一個v-for美滋滋循環(huán)的時候。突然之間就報錯了。
循環(huán)不起來的我仔細查看得到的內(nèi)容。是數(shù)組沒錯?。?/p>

data = {
    "0":1,
    "1":2,
    length:2,
    __proto__:Array.prototpye
}

等等,好像有什么地方不太對勁。我記得數(shù)組,好像是方括號啊,為什么它這個東西是花括號。

最特么蛋疼的是,我使用Object.getPrototypeOf查看proto時,里面的內(nèi)容顯示這個數(shù)據(jù)確實是一個array。

我們都知道,當使用console.log打印一個數(shù)組的時候,是可以看到,正常的數(shù)組中,包括內(nèi)容,length,和proto三部分。

重點就是這個proto,這里我們得復習一下原型鏈了,原型鏈就是指,你到底創(chuàng)見的是誰的實例,它包含的是實例的信息。比如說,我們new Array,創(chuàng)建的就是Array,它的proto就指Array。

它是個身份信息。

令人迷惑的地方也就在這里了,我打印這貨的proto。它確實是一個數(shù)組。但是為什么它不能使用數(shù)組方法去循環(huán)了。

調(diào)查之下,我發(fā)現(xiàn)了真相。

這貨只是一個看起來像數(shù)組的,偽數(shù)組?;蛘呓校悢?shù)組。

并且它的proto還特么指向了Array.prototype,Array的原型鏈。所以,它從身份信息上看,確實是數(shù)組。但是,它的并不是通過new Array出來的。

請接著看。

如何判斷一個數(shù)據(jù)是數(shù)組


請先看例子:

var arr = [1,2,3];
//判斷是否為數(shù)組
console.log(Array.isArray(arr));

//typeof只能用于檢測基本類型 不能用于檢測array
console.log(typeof []); //object
console.log(typeof {}); //object
console.log(typeof function(){}); //function

console.log(typeof "abc"); //string
console.log(typeof 123); //number

var a;//定義a但是不給a賦值
console.log(typeof a); //undefined
console.log(typeof null); //object 是的你沒看錯,null的數(shù)據(jù)類型就是object
//https://blog.csdn.net/qq_36689178/article/details/81503605
console.log(typeof undefined); //undefined

可見檢查變量類型的方法有兩個,一個是typeof,另一個是更具有針對性的Array.isArray方法。

typeof如果你檢查的是一個引用類型,那么一定會返回object,比如說數(shù)組。所以這里你必須使用Array.isArray來判斷。

那么,我們?nèi)绻皇褂胑s6,在es5中有沒有辦法判斷一個數(shù)據(jù)是array呢?當然能了!官方提供了一個Object.prototype.toString.call()方法。

就算你偽裝的很像也依然能判斷出來!

var a =[1,2,3]
console.log(Object.prototype.toString.call(a)); //[object Array]
var larr = {
    "0":1,
    "1":2,
    "length":2,
    __proto__:Array.prototype
}
console.log(Object.prototype.toString.call(larr)); //[object Object]

在es6中提供了Array.isArray和Array.from方法,判斷和轉(zhuǎn)化數(shù)組,非常的方便。
es6中類數(shù)組轉(zhuǎn)化為數(shù)組和判斷數(shù)組的方式。

var larr = {
    "0":1,
    "1":2,
    "length":2,
    __proto__:Array.prototype
}

//es6
//類數(shù)組
console.log(Array.isArray(larr));//fales
console.log(Array.isArray(Array.from(larr)));//ture

如果你需要在es5中轉(zhuǎn)化類數(shù)組 ,需要使用

var a={length:2,0:'aaa',1:'bbb'};  
Array.prototype.slice.call(a);//  ["aaa", "bbb"]   
  
var a={length:2};  
Array.prototype.slice.call(a);//  [undefined, undefined]  

Object.prototype.toString.call詳解


toString這個方法非常好理解

比如:

var a = [1,2]
console.log(a.toString());

使用toString方法以后,變成1,2
這個方法的意思是把對象里面的內(nèi)容變成字符串。

ok,那么Object.prototype就是指一個對象的prototype。

call方法,用于改變this指針的方向。

這里,最后括號里面放進去的是array本身,因為array對象本身也返回一個構造函數(shù),通過call把構造函數(shù)本身的this指向obj,來調(diào)用Object.prototype.toString。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容