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

时间:2011-11-30 12:11:47

标签: 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

索引3有效。 为什么它会返回假?

注意:我正在使用最新的Firefox。

它应该仅对没有指定索引号3的稀疏数组返回false。

更新:索引3有效,因此它应该返回true。在运算符中不验证索引位置的值,它只是验证索引的有效性而不是值

2 个答案:

答案 0 :(得分:7)

3 in arrfalse因为arr[3]从未设置(因此数组确实是稀疏的)。

请注意

中的双逗号
var arr = [obj1,obj2,1,,2];

- 如果你做到了

var arr = [obj1,obj2,1,2];

然后3 in arr变为true

请参阅specification

中的第63页
  

可以在元素列表的开头,中间或末尾省略数组元素。每当一个逗号在   元素列表之前没有AssignmentExpression(即开头或之后的逗号   逗号),缺少的数组元素有助于数组的长度并增加索引   后续要素。未定义Elided数组元素。如果元素在数组末尾被省略,   该元素对数组的长度没有贡献。

- 换句话说,代码的行为与

相同
var arr = [obj1, obj2, 1];
arr[4] = 2;

答案 1 :(得分:0)

Javascript正在评估未定义的值。未定义是假的。

数组总是有0个索引,在你的数组中第4个元素(3个索引)没有设置为任何值。

参考this

来自链接

  

以下是JavaScript中的错误:

     
      
  •   
  •   
  • 未定义
  •   
  • 空字符串
  •   
  • ''
  •   
  • 数字0数字NaN(是的,'非数字'是数字,是特殊数字)
  •   
     

其他一切都是真实的,包括无限(这是   另一个特殊数字,如NaN),以及所有Object对象和Array   对象,空或不。