【问题标题】:Javascript - array index issue in non sparse arrayJavascript - 非稀疏数组中的数组索引问题
【发布时间】:2011-11-30 20:38:52
【问题描述】:

非稀疏数组本质上是连续的,从 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 有效。 为什么返回false?

注意:我使用的是最新的 Firefox。

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

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

【问题讨论】:

标签: javascript


【解决方案1】:

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

注意里面的双逗号

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

– 如果你做到了

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

然后3 in arr 变为true

specification中的第63页:

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

——换句话说,你的代码的行为与

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

【讨论】:

  • 不是 [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]] 可以神奇地设置“长度”),它显然没有“3”属性。
【解决方案2】:

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

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

参考this

来自链接

以下是 JavaScript 中的虚假内容:

  • 未定义
  • 空字符串
  • ''
  • 数字 0 数字 NaN(是的,'Not a Number' 是一个数字,它是一个特殊数字)

其他一切都是真实的,包括 Infinity(即 另一个特殊数字,如 NaN),以及所有 Object 对象和 Array 对象,无论是否为空。

【讨论】:

  • 0 in [undefined] === true 所以我不确定这是否完全正确。
  • 索引 3 是有效的,所以它应该返回 true。 in 运算符不验证索引位置的值,它只是验证索引的有效性而不是值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多