数组字面量是个神奇东西,试在chrome的控制台打印如下内容:
>>>[] [] >>>[,] [] >>>[,,] []
但这不是真相,我们用火狐的firebug看看:
>>> [] [] >>> [,] [undefined] >>> [,,] [undefined, undefined]
这种显示方式类似其他语言的inspect方法,我们不妨再看看其toString方法:
>>> [].toString() "" >>> [,].toString() "" >>> [,,].toString() ","
我们发现最一个逗号总是被省去的,本来应该是两个元素夹半一个逗号,现在[,]里面只有一个元素undefined
>>>[,].length 1
我们再用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