基礎(chǔ)儲(chǔ)備
數(shù)組的本質(zhì)就是一種特殊的對(duì)象,使用typeof可以返回?cái)?shù)組的類(lèi)型是Object,然后數(shù)組的特殊性在于他的鍵名是按次序排列的一組整數(shù)(0,1,2…)。

鍵名類(lèi)型
JavaScript語(yǔ)言規(guī)定,對(duì)象的鍵名一律為字符串,所以,數(shù)組的鍵名其實(shí)也是字符串。之所以可以用數(shù)值讀取,是因?yàn)榉亲址逆I名會(huì)被轉(zhuǎn)為字符串。
由于數(shù)組成員的鍵名是固定的,因此數(shù)組不用為每個(gè)元素指定鍵名,而對(duì)象的每個(gè)成員都必須指定鍵名。
所以我們?cè)谏厦娼貓D中得到的鍵名是“0”,“1”;
如果一個(gè)值可以被轉(zhuǎn)換為 整數(shù) ,則以該值為鍵名,等于以對(duì)應(yīng)的整數(shù)為鍵名。

用可以轉(zhuǎn)為整數(shù)字符串做鍵名

必須要是能轉(zhuǎn)為整數(shù),5.0浮點(diǎn)數(shù)可以轉(zhuǎn)為整數(shù)5,而5.1不能轉(zhuǎn)為整數(shù)5
問(wèn)題
但是當(dāng)我們用arr['p'] =3;的時(shí)候,我們會(huì)發(fā)現(xiàn)并不會(huì)改變arr.length屬性

arr.length并沒(méi)有改變
但是我們打印arr的時(shí)候就會(huì)出現(xiàn)下列結(jié)果

為什么length不改變,但是打印arr為什么有p屬性 呢
這是為什么呢?
查閱了很多資料,然后再找到了關(guān)鍵
- 數(shù)組的屬性length的基本功能是追蹤數(shù)組的最大索引
2.length屬性表示一個(gè)無(wú)符號(hào) 32-bit 整數(shù),返回一個(gè)數(shù)組中的元素個(gè)數(shù)。 - 一個(gè)屬性鍵n(假設(shè)n為字符串)是某個(gè)數(shù)組的索引當(dāng)且僅當(dāng)ToString(ToUint32(n))等于n且ToUnit32(n)不等于232 -1,
- 數(shù)組屬性的鍵是數(shù)組索引,這個(gè)屬性成為元素,也可以理解為數(shù)組成員,
- 換句話說(shuō),在規(guī)范中所有方括號(hào)中的值,甚至是數(shù)字,都可以轉(zhuǎn)換為字符串且解釋為屬性的鍵。
- 屬性n(字符串)如果要作為數(shù)組索引必須等于把P轉(zhuǎn)換為的數(shù)字,等于把數(shù)字轉(zhuǎn)換為32位無(wú)符號(hào)的整數(shù),等于把整型轉(zhuǎn)化為的字符串,即數(shù)組的索引必須是字符串化的整型,而且是在0<=i<232-1范圍內(nèi)。
在例子中arr['p']中的p,將‘p'進(jìn)行轉(zhuǎn)換實(shí)驗(yàn)

因?yàn)?** 屬性n(字符串)如果要作為數(shù)組索引必須等于(把P轉(zhuǎn)換為數(shù)字,把數(shù)字轉(zhuǎn)換為32位無(wú)符號(hào)整數(shù),把整型轉(zhuǎn)化為字符串)**,但是上面實(shí)驗(yàn)截圖現(xiàn)實(shí)'p'即不等于將'p'轉(zhuǎn)換的數(shù)字,也不等于將這個(gè)數(shù)字轉(zhuǎn)換了的32位無(wú)符號(hào)整數(shù),也不等于將這個(gè)整型轉(zhuǎn)換為的字符串。所以p不能作為數(shù)組索引,而只是數(shù)組的一個(gè)屬性了。因此當(dāng)屬性n(字符串)不是一個(gè)字符串化的整型時(shí),或者不在范圍0<=i<232-1范圍內(nèi)時(shí),他的效果就是數(shù)組的一個(gè)屬性(數(shù)組也是一個(gè)對(duì)象,這個(gè)n只是該對(duì)象的一個(gè)普通屬性),

arr['p'] ='y'的效果和作用和arr.p ='y'是一樣的
因此,解釋到這里,就能理解為什么當(dāng)使用arr['p'] =3的時(shí)候,并不會(huì)改變arr.length屬性。因?yàn)閍rr['p']不是數(shù)組元素,而length是返回?cái)?shù)組的元素個(gè)數(shù)的屬性,索引增加arr['p']不會(huì)改變length的長(zhǎng)度。
小知識(shí)
Array對(duì)象的length屬性是一個(gè)數(shù)據(jù)屬性,其值始終大于每個(gè)可刪除屬性的名稱(chēng),其名稱(chēng)為數(shù)組索引。
length屬性最初具有屬性{[[Writable]]:true,[[Enumerable]]:false,[[Configurable]]:false}。