不存在的数组元素
数组字面量是个神奇东西,试在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
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
浙公网安备 33010602011771号