正在安靜的擼碼,PHP老公突然Q我,問,“你們JS里數(shù)組能用非數(shù)字下標(biāo)嗎?!?/p>
并沒有仔細(xì)思考的我,扔給他一句,“不行,鬧呢,2的32次方都不夠使了么?!?/p>
然而,事情并沒有如我所料的結(jié)束,片刻之后,他滴滴我,說“你個大混子,這是可以的?!比缓笕咏o我一個截圖。
JS的Array是可以有非數(shù)字下標(biāo)的,就是有些行為怪異。你說這人非要用PHP什么的東西往JS里套,還來麻煩我,我能怎么辦,我也很絕望啊??刂婆_里看一下吧。
let a=[];
a['aa']='bb'
console.log(a);
//[aa: "bb"]
//aa: "bb"
//length: 0
霸氣的把length=0化了線zhuai給他。JSer們并不怎么用這個奇怪的寫法是有原因的啊。length=0了你要我們怎么辦!.pop()和.shift()等作用于數(shù)組元素的方法你要我們怎么用?恩?
再者,如果不是 === 的情況下,JS很難分清'1'和1有什么區(qū)別。所以如果你的下標(biāo)突然變成了一個字符串?dāng)?shù)字就有意思了。
let a=[];
a['aa']='bb';
a['100']='vvvvv';
console.log(a.length);
//101
就是這么神奇。js表示’100’和100長得一樣啊并沒有區(qū)別啊那個引號是什么我讀書少你別騙我。所以這個時候js會自動把a(bǔ)[‘100’]當(dāng)成a[100]來使用,把當(dāng)前數(shù)組的長度變成100,再把'vvvvv'這個value push到最后,哪怕真實(shí)長度只有2……
所以,這是為啥?
當(dāng)給一個js數(shù)組添加字符串下標(biāo)的時候,就相當(dāng)于為該數(shù)組對象添加了一個自定義屬性,這就是所謂的“字符串下標(biāo)”。而為數(shù)組添加屬性并不會增加數(shù)組長度,所以長度不會發(fā)生改變了。你到是能用key找到這個value,但是你并沒有辦法遍歷它。
a.forEach(v=>console.log(v))
//'vvvvv'
看你只能得到后來增加的那個index為101的'vvvvv'。
所以呢,來自stackoverflow的Michael Berkowski:“如果要使用的是一個完全由'字符串下標(biāo)'組成的數(shù)組,那還是將其聲明為一個Object類型的對象要更好一些。”
對啊,有對象干嘛還要找數(shù)組!數(shù)組長得比對象美嗎!口亨!