现在的位置: 首页 > 综合 > 正文

不存在的数组元素

2013年04月13日 ⁄ 综合 ⁄ 共 1231字 ⁄ 字号 评论关闭

数组字面量是个神奇东西,试在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

抱歉!评论已关闭.