先來看一個問題:javascript
var array = []; array["a"] = "hello"; array["b"] = "world"; array["c"] = "yes"; console.log("length: " + array.length);//0
在以前看過的許多javascript書籍中,都宣稱js是可使用字符串做爲數組下標的,所以我在用的時候也沒以爲有什麼不妥。可是在查看最後一句的控制檯輸出結果的時候,始料未及的狀況出現了:length爲0java
顯示的數組的length值竟然是零,接着測試一下以前的步驟是否成功對數組進行了操做:數組
正常打印出了數組,而且根據字符串索引正確取到了數組裏面的value值測試
證實了以前的操做是成功的,那麼既然數組的下標能夠是字符串,爲何插入元素以後數組的長度顯示仍然爲零呢?url
爲了進一步探索這其中的問題,我將上面的代碼作了一點改動:spa
如今length的值變成了21。數組至關於就是20個空元素,加上索引20的元素value值21,後面三個key爲a、b、c的元素.net
爲了一探究竟,我將索引改爲字符串100,打印整個array數組的信息,輸出結果以下:,3d
這下能夠看到我往數組中添加的全部元素的信息了,可是等等。。。這樣的顯示方式有點眼熟,看起來不像通常數組的顯示方式,反而像是個對象!code
咱們知道Array對象是從Object對象繼承獲得的,那麼莫非這些「看不見」的「數組元素」都變成了當前這個Array實例對象的屬性?對象
對於這個問題,Michael Berkowski大神是這樣解釋的:
Javascript的數組其實不像PHP或者其餘一些語言同樣擁有真正的字符串下標,當咱們試圖爲一個js數組添加字符串下標的時候,其實就至關於爲該數組對象添加了一個屬性,屬性名稱就是咱們所謂的「字符串下標」。因爲爲數組對象添加屬性不會影響到同爲該對象屬性的length的值,所以該值將始終爲零。一樣地,.pop()和.shift()等做用於數組元素的方法也不可以做用於這些對象屬性。所以,若是要使用的是一個徹底由「字符串下標」組成的數組,那仍是將其聲明爲一個Object類型的對象要更好一些。
可是到了這裏新的問題又冒出來了,既然具備字符串下標的元素會被做爲該數組對象的屬性,那麼爲何array["10"]這一項會致使length的值變成11呢?我找到了如下這篇文章:《JS數組下標的總結》在該文章的第一句中就回答了這個問題。根據通過一系列討論以後獲得的結果,將上述問題的答案整理以下:
Javascript數組下標值的範圍爲0到2的32次方。
對於任意給定的數字下標值,若是不在此範圍內,js會將它轉換爲一個字符串,並將該下標對應的值做爲該數組對象的一個屬性值而不是數組元素,例如array[-1] = "yes" 其實就至關於給array對象添加了一個名爲-1的屬性,屬性值爲yes。
若是該下標值在合法範圍內,則不管該下標值是數字仍是數字字符串,都一概會被轉化爲數字使用,即 array["100"] = 0 和 array[100] = 0 執行的是相同的操做。