數組字面量是個神奇東西,試在chrome的控制台列印如下內容:
>>>[][]>>>[,][]>>>[,,][]
但這不是真相,我們用Firefox的firebug看看:
>>> [][]>>> [,][undefined]>>> [,,][undefined, undefined]
這種顯示方式類似其他語言的inspect方法,我們不妨再看看其toString方法:
>>> [].toString()"">>> [,].toString()"">>> [,,].toString()","
我們發現最一個逗號總是被省去的,本來應該是兩個元素夾半一個逗號,現在[,]裡面只有一個元素undefined
>>>[,].length1
我們再用ecma262v5新增的元編程方法,Object.getOwnPropertyDescriptor看看。此方法是用於查看某個對象的某個屬性對應的特徵描述。
>>>Object.getOwnPropertyDescriptor([,], 0) undefined //由於它基本不存在第一個元素(索引值為0),因此當然沒有對應的特徵描述
相對應,如果它存在元素,即使其值為undefined
>>>Object.getOwnPropertyDescriptor([undefined], 0) //chrome 的結果Object configurable: true enumerable: true value: undefined writable: true __proto__: Object//=============================================================>>> Object.getOwnPropertyDescriptor([undefined], 0) //firebug的結果Object { writable=true, enumerable=true, configurable=true}
但當然,上面的都是非常規範與超前的東西,這些東西在IE下可能就行不通了,如[,].length在IE678顯示為2!更多怪異的現象見下面這個比較,對於數組的undefined元素不同產生方式,其可遍曆性也不一樣。
var a1 = [,,,]; var a2 = new Array(3); var a3 = [undefined,undefined,undefined]; alert(0 in a1); alert(0 in a2); alert(0 in a3); //FF4 false false true //opera10 false false true //chrome false false true //IE6 false false false //IE8 false false false //IE8 false false false //IE9 false false true //IE10p false false true //搜狗2.2 false false true //360極速 false false true