javascript數組中數字和非數字下標的區別

轉載自:http://www.cnblogs.com/ZJAJS/archive/2013/01/19/2867847.html

考完試後閒來無事,想起好多天沒寫js了,於是打算實踐一下最近看到的一些好玩的點子。結果寫着寫着,發現了一點有趣的小問題。出現問題的代碼如下:

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

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

顯示的數組的length值居然是零,接着測試一下之前的步驟是否成功對數組進行了操作,console.log(“array[b]: ” + array[“b”]); 的控制檯輸出結果如下:

證明了之前的操作是成功的,那麼既然數組的下標可以是字符串,爲什麼插入元素之後數組的長度顯示仍然爲零呢?爲了進一步探索這其中的問題,我將上面的代碼做了一點改動:

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

此時控制檯中顯示的結果爲:

唔,現在length的值變成了11。爲了一探究竟,我把最後一行賦值語句的數組下標從10加到了100,並在控制檯打印整個array數組的信息,輸出結果如下:

這下可以看到我們之前往數組中添加的所有元素的信息了,但是等等。。。這樣的顯示方式有點眼熟,看起來不像一般數組的顯示方式,反而像是個對象!(表打我。。我知道數組也是對象::><::)我們知道Array對象是從Object對象繼承得到的,那麼莫非這些“看不見”的“數組元素”都變成了當前這個Array實例對象的屬性?

好吧,一個人在這裏純YY是木有用處的,還是看看網上的大神們是怎麼說的吧。我在stackoverflow找到了一個一模一樣的問題:http://stackoverflow.com/questions/10326635/string-index-in-js-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 執行的是相同的操作。

發佈了11 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章