我可以将一个项目添加到数组中,然后我可以访问该项目,但length
报告0
。为什么呢?
var arr = [];
arr[4294967300] = "My item";
console.log(arr[4294967300], arr.length); // Outputs "My item", 0
答案 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
)。