该项目存在于数组中,但它表示该数组的长度为0?

时间:2012-10-16 10:25:52

标签: javascript

我可以将一个项目添加到数组中,然后我可以访问该项目,但length报告0。为什么呢?

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

1 个答案:

答案 0 :(得分:6)

那是因为索引太大而不能转换为属性,因此长度为0。

根据ECMAScript documentation,当且仅在以下情况下,特定值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)。