這個(gè)數(shù)據(jù)好像不是數(shù)組
當(dāng)后臺(tái)給我們傳遞了一個(gè)數(shù)組,我們正好來一個(gè)v-for美滋滋循環(huán)的時(shí)候羹蚣。突然之間就報(bào)錯(cuò)了原探。
循環(huán)不起來的我仔細(xì)查看得到的內(nèi)容。是數(shù)組沒錯(cuò)巴缢亍:
data = {
"0":1,
"1":2咽弦,
length:2,
__proto__:Array.prototpye
}
等等,好像有什么地方不太對(duì)勁胁出。我記得數(shù)組型型,好像是方括號(hào)啊,為什么它這個(gè)東西是花括號(hào)全蝶。
最特么蛋疼的是闹蒜,我使用Object.getPrototypeOf查看proto時(shí),里面的內(nèi)容顯示這個(gè)數(shù)據(jù)確實(shí)是一個(gè)array裸诽。
我們都知道嫂用,當(dāng)使用console.log打印一個(gè)數(shù)組的時(shí)候,是可以看到丈冬,正常的數(shù)組中嘱函,包括內(nèi)容,length埂蕊,和proto三部分往弓。
重點(diǎn)就是這個(gè)proto疏唾,這里我們得復(fù)習(xí)一下原型鏈了,原型鏈就是指函似,你到底創(chuàng)見的是誰的實(shí)例槐脏,它包含的是實(shí)例的信息。比如說撇寞,我們new Array顿天,創(chuàng)建的就是Array,它的proto就指Array蔑担。
它是個(gè)身份信息牌废。
令人迷惑的地方也就在這里了,我打印這貨的proto啤握。它確實(shí)是一個(gè)數(shù)組鸟缕。但是為什么它不能使用數(shù)組方法去循環(huán)了。
調(diào)查之下排抬,我發(fā)現(xiàn)了真相懂从。
這貨只是一個(gè)看起來像數(shù)組的,偽數(shù)組蹲蒲》Γ或者叫,類數(shù)組悠鞍。
并且它的proto還特么指向了Array.prototype对室,Array的原型鏈。所以咖祭,它從身份信息上看,確實(shí)是數(shù)組蔫骂。但是么翰,它的并不是通過new Array出來的。
請(qǐng)接著看辽旋。
如何判斷一個(gè)數(shù)據(jù)是數(shù)組
請(qǐng)先看例子:
var arr = [1,2,3];
//判斷是否為數(shù)組
console.log(Array.isArray(arr));
//typeof只能用于檢測(cè)基本類型 不能用于檢測(cè)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 是的你沒看錯(cuò)浩嫌,null的數(shù)據(jù)類型就是object
//https://blog.csdn.net/qq_36689178/article/details/81503605
console.log(typeof undefined); //undefined
可見檢查變量類型的方法有兩個(gè),一個(gè)是typeof补胚,另一個(gè)是更具有針對(duì)性的Array.isArray方法码耐。
typeof如果你檢查的是一個(gè)引用類型,那么一定會(huì)返回object溶其,比如說數(shù)組骚腥。所以這里你必須使用Array.isArray來判斷。
那么瓶逃,我們?nèi)绻皇褂胑s6束铭,在es5中有沒有辦法判斷一個(gè)數(shù)據(jù)是array呢廓块?當(dāng)然能了!官方提供了一個(gè)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這個(gè)方法非常好理解
比如:
var a = [1,2]
console.log(a.toString());
使用toString方法以后会通,變成1,2
這個(gè)方法的意思是把對(duì)象里面的內(nèi)容變成字符串贷掖。
ok,那么Object.prototype就是指一個(gè)對(duì)象的prototype渴语。
call方法苹威,用于改變this指針的方向。
這里驾凶,最后括號(hào)里面放進(jìn)去的是array本身牙甫,因?yàn)閍rray對(duì)象本身也返回一個(gè)構(gòu)造函數(shù),通過call把構(gòu)造函數(shù)本身的this指向obj调违,來調(diào)用Object.prototype.toString窟哺。