非稀疏数组本质上是连续的,从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。在运算符中不验证索引位置的值,它只是验证索引的有效性而不是值
答案 0 :(得分:7)
3 in arr
为false
因为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 对象,空或不。