Javascript-非稀疏数组中的数组索引问题
非稀疏数组本质上是连续的,从0到长度-1,对于“in”运算符,所有索引都应返回true。对于空元素也应该如此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 它应该仅对没有指定索引号
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(是的,“不是数字”是一个数字,它是一个特殊的数字)
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”属性。