创建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
这是真实的,书籍还是现实世界?
答案 0 :(得分:6)
看起来这本书是错的。正如您在specification中看到的那样,[,,,]
不会向数组中添加任何值:
生产 ArrayLiteral:[Elision opt ] 评估如下:
- 让 array 成为创建新对象的结果,就像使用表达式new Array()一样,其中 Array 是具有该名称的标准内置构造函数。< / LI>
- 让 pad 成为评估 Elision 的结果;如果不存在,请使用数值零。
- 使用参数“length”,pad和false调用数组的
[[Put]]
内部方法。- 返回阵列。
醇>
(“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