非稀疏数组本质上是连续的,从0到长度为1,所有索引都应该为'in'运算符返回true.对于空元素也应如此.
obj1 = {x:1,y:2};
obj2 = Object.create(obj1);
obj2.z = 5;
var arr = [obj1,obj2,1,,2];
console.log(arr.length); //5
console.log(3 in arr);//false
Run Code Online (Sandbox Code Playgroud)
索引3有效.为什么它会返回假?
注意:我使用的是最新的Firefox.
它应该仅对没有指定索引号3的稀疏数组返回false.
更新:索引3有效,因此它应返回true.在运算符中不验证索引位置的值,它只是验证索引的有效性而不是值
3 in arr是false因为arr[3]永远不会设置(并且因此该阵列是确实稀疏).
请注意双逗号
var arr = [obj1,obj2,1,,2];
Run Code Online (Sandbox Code Playgroud)
- 如果你这样做的话
var arr = [obj1,obj2,1,2];
Run Code Online (Sandbox Code Playgroud)
然后3 in arr成为true.
请参阅规格中的第63页:
可以在元素列表的开头,中间或末尾省略数组元素.每当元素列表中的逗号前面没有AssignmentExpression(即开头的逗号或另一个逗号后面的逗号)时,缺少的数组元素会增加数组的长度并增加后续元素的索引.未定义Elided数组元素.如果在数组的末尾省略了元素,则该元素不会影响数组的长度.
- 换句话说,代码的行为是相同的
var arr = [obj1, obj2, 1];
arr[4] = 2;
Run Code Online (Sandbox Code Playgroud)