歡迎關(guān)注微信公眾號(hào):全棧工廠
本文主要參考
一直以來(lái)穿梭于前端后端之間,突然間發(fā)現(xiàn)自己對(duì)JS的數(shù)組和對(duì)象操作有些混淆了,因?yàn)樗麄兊牟僮鞣绞教窳恕@鐢?shù)組 var arr = [1,2,3,4,5]
和對(duì)象 var obj = {'0':1, '1':2, '2':3, '3':4, '4':5}
:
arr[3]
obj[3]
都會(huì)輸出4
arr[5]=6
obj[5]=6
都會(huì)給變量添加新值6
而且,在PHP中$arr = [1,2,3,4,5]
與 $obj = ['0'=>1, '1'=>2, '2'=>3, '3'=>4, '4'=>5]
完全等價(jià),這更加劇了我的頭暈!今兒個(gè)勢(shì)必搞清楚~
這倆貨區(qū)別到底在哪里?
帶著這個(gè)疑問,我在 ECMA-262標(biāo)準(zhǔn) 9.4.2節(jié)中找到了答案:
這段話翻譯過來(lái)意思是:
???????數(shù)組其實(shí)是一個(gè)對(duì)數(shù)組索引屬性值做特殊處理的一個(gè)"特殊對(duì)象",在這個(gè)“特殊對(duì)象”中,如果一個(gè)屬性的屬性名滿足數(shù)組索引屬性的條件,那么我們稱這個(gè)屬性為一個(gè)數(shù)組元素。每一個(gè)數(shù)組對(duì)象默認(rèn)會(huì)有一個(gè)小于 232的非負(fù)整數(shù)屬性
length
,length
屬性在數(shù)值上大于所有數(shù)組索引值,每當(dāng)數(shù)組對(duì)象添加或者更新屬性的時(shí)候,其他屬性甚至?xí)徽{(diào)整來(lái)讓length
屬性盡量保持不變;除非新添加的屬性是一個(gè)數(shù)組索引length
屬性值才會(huì)被修改,并且新調(diào)整的值在數(shù)值上大于所有數(shù)組索引值。如果length
屬性被修改,那么數(shù)組對(duì)象中所有大于等于length
屬性值的數(shù)組索引屬性將會(huì)被刪除(從原型中繼承的數(shù)組索引屬性不會(huì)有影響)。
???????注:數(shù)組索引屬性:如果一個(gè)字符串屬性P在強(qiáng)轉(zhuǎn)為無(wú)符號(hào)整形(ToUint32)后小于(232?1)并且強(qiáng)轉(zhuǎn)后的值再轉(zhuǎn)為字符串(ToString(ToUint32(P)))與原字符串(P)相等,那么屬性P為數(shù)組索引屬性。
???????數(shù)組對(duì)象會(huì)自動(dòng)生成length
屬性。
???????數(shù)組對(duì)象除了提供[[DefineOwnProperty]]選擇定義內(nèi)部方法以外,還提供了9.1標(biāo)注的所有必要內(nèi)部方法。
通過上面這段話以及已經(jīng)掌握的知識(shí),我們可以總結(jié)出JavaScript中數(shù)組與對(duì)象的區(qū)別與聯(lián)系主要有:
① 數(shù)組是一個(gè)特殊的對(duì)象,數(shù)組具有對(duì)象的所有性質(zhì);
② 數(shù)組可以是一個(gè)有序的數(shù)據(jù)集合,而對(duì)象是無(wú)序的(因?yàn)閿?shù)組是一個(gè)特殊的對(duì)象,所有如果按照對(duì)象的方法操作數(shù)組,那么數(shù)組也可以是無(wú)序的);
③ 數(shù)組中的屬性會(huì)區(qū)分?jǐn)?shù)字字符串和普通字符串,如果是數(shù)字字符串且強(qiáng)轉(zhuǎn)后數(shù)值小于(232?1),那么我們稱該屬性為索引屬性,數(shù)組對(duì)索引屬性會(huì)區(qū)別操作;
④ 數(shù)組默認(rèn)會(huì)有一個(gè)length
屬性,該屬性與數(shù)組索引屬性的操作密切關(guān)聯(lián),該屬性具有以下幾個(gè)特點(diǎn):
???????????1.length
屬性值始終大于數(shù)組中所有索引屬性值(所以如果數(shù)組中索引屬性值是不連續(xù)的,那么length
值并不能反映數(shù)組中元素的個(gè)數(shù));
???????????2.如果直接對(duì)數(shù)組中length
屬性賦值,那么數(shù)組中所有大于等于length
屬性值的索引屬性都會(huì)被刪除(原型中繼承的索引屬性除外)
注:文中如有任何錯(cuò)誤,請(qǐng)各位批評(píng)指正!