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

Javascript 该项存在于数组中,但它表示数组的长度为0?,javascript,Javascript,我可以将一个项目添加到数组中,并访问该项目,但长度报告0。为什么? var arr = []; arr[4294967300] = "My item"; console.log(arr[4294967300], arr.length); // Outputs "My item", 0 这是因为索引太大了,它会变成一个属性,因此长度为0 根据,特定值p只能是数组索引,当且仅当: (p >>> 0 === p) && (p >>> 0 !== M

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

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

这是因为索引太大了,它会变成一个属性,因此长度为0

根据,特定值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'

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

我认为JavaScript已经被扩展到了极限。哦,JavaScript!这种索引会使任何编程语言都超出极限。。巧合也许不是;)如果您想获得该对象的“长度”,请参见本例中实际使用的代码将返回
1
,但如果我希望它像数组一样工作,我希望看到长度
4294967301
诚实的问题,是否有任何理由使用零填充位移位而不是其他移位或按位或
p | 0
?@StuartWakefield这是一种特殊的shr操作,因为它还强制转换为无符号32位整数,因此额外的kick使用三个括号:)难道不是所有的按位运算符都将操作数强制转换为32位整数吗?@StuartWakefield是,所有按位运算符都强制转换为int32,但>>>也会清除符号位,将其转换为uint32Nice位,完美地回答它
-1 | 0
给出
-1
,但
-1>>0
给出
4294967295
。为我发现这一点干杯