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

Stu*_*eld 4 javascript

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

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

Ja͢*_*͢ck 6

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

根据ECMAScript文档,当且仅当以下情况时,特定值p才能是数组索引:

(p >>> 0 === p) && (p >>> 0 !== Math.pow(2, 32) - 1)
Run Code Online (Sandbox Code Playgroud)

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

4294967300 >>> 0 // 4
Run Code Online (Sandbox Code Playgroud)

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

arr[-1] = 'hello world';
arr.length; // 0
arr['-1']; // 'hello world'
Run Code Online (Sandbox Code Playgroud)

如果你的数字介于有效(并被用作索引)和"无效"(它变成属性)之间,那么最好将所有索引转换为字符串并一直使用属性(开始)以{}代替Array).