1. 程式人生 > >JS 中數組字符串索引和數值索引研究

JS 中數組字符串索引和數值索引研究

組成 ava RF 分享 style spa 這樣的 使用字符串 alt

  先來看一個問題:

var array = [];
array["a"] = "hello";
array["b"] = "world";
array["c"] = "yes";
console.log("length: " + array.length);//0

  在之前看過的許多javascript書籍中,都宣稱js是可以使用字符串作為數組下標的,因此我在用的時候也沒覺得有什麽不妥。但是在查看最後一句的控制臺輸出結果的時候,始料未及的情況出現了:length為0

  顯示的數組的length值居然是零,接著測試一下之前的步驟是否成功對數組進行了操作:

技術分享圖片

  正常打印出了數組,並且根據字符串索引正確取到了數組裏面的value值

  證明了之前的操作是成功的,那麽既然數組的下標可以是字符串,為什麽插入元素之後數組的長度顯示仍然為零呢?

  為了進一步探索這其中的問題,我將上面的代碼做了一點改動:

技術分享圖片

  現在length的值變成了21。數組相當於就是20個空元素,加上索引20的元素value值21,後面三個key為a、b、c的元素

  為了一探究竟,我將索引改成字符串100,打印整個array數組的信息,輸出結果如下:,技術分享圖片

  這下可以看到我往數組中添加的所有元素的信息了,但是等等。。。這樣的顯示方式有點眼熟,看起來不像一般數組的顯示方式,反而像是個對象!

  我們知道Array對象是從Object對象繼承得到的,那麽莫非這些“看不見”的“數組元素”都變成了當前這個Array實例對象的屬性?

  對於這個問題,Michael Berkowski大神是這樣解釋的

  Javascript的數組其實不像PHP或者其他一些語言一樣擁有真正的字符串下標,當我們試圖為一個js數組添加字符串下標的時候,其實就相當於為該數組對象添加了一個屬性,屬性名稱就是我們所謂的“字符串下標”。由於為數組對象添加屬性不會影響到同為該對象屬性的length的值,因此該值將始終為零。同樣地,.pop()和.shift()等作用於數組元素的方法也不能夠作用於這些對象屬性。因此,如果要使用的是一個完全由“字符串下標”組成的數組,那還是將其聲明為一個Object類型的對象要更好一些。

  但是到了這裏新的問題又冒出來了,既然具有字符串下標的元素會被作為該數組對象的屬性,那麽為什麽array["10"]這一項會導致length的值變成11呢?我找到了以下這篇文章:《JS數組下標的總結》http://www.phper.org.cn/?post=65,在該文章的第一句中就回答了這個問題。根據經過一系列討論之後得到的結果,將上述問題的答案整理如下:

 Javascript數組下標值的範圍為0到2的32次方

  對於任意給定的數字下標值,如果不在此範圍內,js會將它轉換為一個字符串,並將該下標對應的值作為該數組對象的一個屬性值而不是數組元素,例如array[-1] = "yes" 其實就相當於給array對象添加了一個名為-1的屬性,屬性值為yes。

  如果該下標值在合法範圍內,則無論該下標值是數字還是數字字符串,都一律會被轉化為數字使用,即 array["100"] = 0 和 array[100] = 0 執行的是相同的操作。

JS 中數組字符串索引和數值索引研究