javascript数组 - 什么是真正的表达式?

时间:2014-01-23 00:32:11

标签: javascript arrays

创建3个未定义的空数组。

var a1 = [,,,];
var a2 = new Array(3);

来自JavaScript:The Definitive Guide,

0 in a1 //true
0 in a2 //false

但是,在现实世界的浏览器中,获得不同的结果。 (IE8和chrome 33 ......)

0 in a1 //false
0 in a2 //false

这是真实的,书籍还是现实世界?

2 个答案:

答案 0 :(得分:6)

看起来这本书是错的。正如您在specification中看到的那样,[,,,]不会向数组中添加任何值:

  

生产 ArrayLiteral:[Elision opt ] 评估如下:

     
      
  1. array 成为创建新对象的结果,就像使用表达式new Array()一样,其中 Array 是具有该名称的标准内置构造函数。< / LI>   
  2. pad 成为评估 Elision 的结果;如果不存在,请使用数值零。
  3.   
  4. 使用参数“length”,pad和false调用数组的[[Put]]内部方法。
  5.   
  6. 返回阵列。
  7.   

(“Elisions”是,,其前面或后面没有表达式。)

简单来说:

  • 创建一个空数组
  • 评估,,基本上只计算它们,从1开始。 所以,,,会产生3。
  • 然后将数组的length设置为结果(例如3)。

这正是new Array(3)正在做的事情。


对于省略元素的描述也不太正式:

  

可以在元素列表的开头,中间或末尾省略数组元素。每当元素列表中的逗号前面没有AssignmentExpression(即开头的逗号或另一个逗号后面的逗号)时,缺少的数组元素会增加数组的长度并增加后续元素的索引。未定义Elided数组元素。如果在数组的末尾省略了元素,则该元素不会影响数组的长度。

答案 1 :(得分:2)

Array构造函数(new Array( 3 ))确实将length属性设置为3,但不创建数组的任何成员 - 甚至不是未定义的值。

  

如果只有一个参数传递给Array构造函数,并且该参数是Number,则构造函数将返回一个新的稀疏数组,其length属性设置为参数的值。应该注意的是,只有新数组的length属性才会这样设置;数组的实际索引不会被初始化。

来源:http://bonsaiden.github.io/JavaScript-Garden/#array.constructor

在Chromium中测试确实会导致两个错误值......

如果给定的密钥不存在,in运算符将返回false:

var a1 = [1,,3,4];

0 in a1 // true
1 in a1 // false