4

我可以将一个项目添加到一个数组中,并且我可以访问该项目,但length报告0. 为什么?

var arr = [];
arr[4294967300] = "My item";
console.log(arr[4294967300], arr.length); // Outputs "My item", 0
4

1 回答 1

6

那是因为索引太大以至于它变成了一个属性,因此长度为0。

根据ECMAScript 文档,特定值 p 只能是数组索引,当且仅当:

(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)

>>> 0相当于哪里ToUint32()。在你的情况下:

4294967300 >>> 0 // 4

根据定义,length属性总是比最大​​有效索引的数值大一;负指数会给你同样的行为,例如

arr[-1] = 'hello world';
arr.length; // 0
arr['-1']; // 'hello world'

如果您的数字介于有效(并用作索引)和“无效”(它变成属性)之间,最好将所有索引转换为字符串并一直使用属性(开始用{}而不是Array)。

于 2012-10-16T10:27:24.007 回答