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

Javascript-非稀疏数组中的数组索引问题,javascript,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 它应该仅对没有指定索引号

非稀疏数组本质上是连续的,从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。in运算符不验证索引位置的值,它只是验证索引的有效性,而不是值,Javascript正在评估未定义的值。未定义是错误的

数组始终具有基于0的索引,在数组中,第4个元素(按索引为3)未设置为任何值

引述

从链接

以下是JavaScript中的falsy:

  • 假的
  • 空的
  • 未定义
  • 空字符串
  • ''
  • 数字0是数字NaN(是的,“不是数字”是一个数字,它是一个特殊的数字)
其他一切都是真实的,包括无限(即 另一个特殊数字,如NaN),以及所有对象和数组 对象,无论是否为空


arr中的
3
false
,因为从未设置
arr[3]
(因此数组确实稀疏)

请注意中的双逗号

var arr = [obj1,obj2,1,,2];
-如果你做到了

var arr = [obj1,obj2,1,2];
然后arr中的
3
变为
true

参见第63页中的:

数组元素可以在元素列表的开头、中间或结尾省略。每当在 元素列表前面没有AssignmentExpression(即,开头或后面有逗号 逗号),缺少的数组元素会增加数组的长度并增加 后续要素。未定义省略的数组元素。如果一个元素在数组的末尾被省略, 该元素不影响数组的长度

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

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

[undefined]==true中的
0,因此我不确定这是否完全正确。索引3有效,因此它应该返回true。in运算符不在索引位置验证的值,它只是验证索引的有效性,而不是值。参考:[obj1,obj2,1,2]是否等同于[obj1,obj2,1,undefined,2]?我认为firefox没有遵循ECMA标准,var a=[,,,];//这个数组是[undefined,undefined,undefined],不需要显式地将这些索引处的值赋给undefined。实际上,
[obj1,obj2,1,2]
提供了
{0:obj1,1:obj2,2:1,4:2,length:5}
一个不同的原型对象(和一个自定义的[[DefineOwnProperty]],它可以神奇地设置“length”),它显然没有“3”属性。