Javascript - 非稀疏数组中的数组索引问题

P K*_*P K 2 javascript

非稀疏数组本质上是连续的,从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.在运算符中不验证索引位置的值,它只是验证索引的有效性而不是值

bal*_*pha 7

3 in arrfalse因为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)