为什么javascript显示具有对象属性而不是索引元素的数组的长度为0

为什么javascript显示具有对象属性而不是索引元素的数组的长度为0,javascript,Javascript,例如: var arr = []; arr[3.4] = 1; console.log(arr.length); 在上面的代码示例中,length属性保留零,因为它的长度为零,所以JS解析器内部的原因和发生的情况为零。必须使用整数作为索引,而不是浮点 var arr=[]; arr[3]=1; 控制台日志(arr.length); 数组的长度反映了数组中存在的最大数组索引。“数组索引”(见下文)是小于232的整数值的属性名称−1.由于3.4不是整数,因此设置它不会改变长度 数组是对象,因此数组

例如:

var arr = [];
arr[3.4] = 1;
console.log(arr.length);

在上面的代码示例中,
length
属性保留零,因为它的长度为零,所以JS解析器内部的原因和发生的情况为零。

必须使用整数作为索引,而不是浮点

var arr=[];
arr[3]=1;
控制台日志(arr.length);

数组的
长度
反映了数组中存在的最大数组索引。“数组索引”(见下文)是小于232的整数值的属性名称−1.由于
3.4
不是整数,因此设置它不会改变
长度

数组是对象,因此数组没有理由不能具有名为
3.4
的属性,但该属性不会影响
长度,因为其名称不符合数组索引的条件

将“数组索引”定义为小于232的整数−1:

当且仅当ToString(ToUint32(p))等于p且ToUint32(p)不等于232时,属性名p(以字符串值的形式)才是数组索引−1."

该定义与
长度
值相关(强调矿山):

每个数组对象都有一个
length
属性,其值始终是一个小于232的非负整数。
length
属性的值在数字上大于其名称为数组索引的每个属性的名称。每当创建或更改数组对象的自身属性时,其他属性根据需要调整es以保持此不变量。具体而言,每当添加名称为数组索引的自有属性时,
长度
属性的值将更改为比该数组索引的数值多一个值(如有必要)


JavaScript数组不能有分数索引

您在那里所做的是在数组对象上分配一个名为
“3.4”
的属性

这不会影响
length
属性,该属性旨在返回比最高有效索引高一个数字


如果您考虑数组应该如何工作,您应该意识到分数偏移是没有意义的。

您可以尝试使用对象与数组

var arr = {};
arr[3.4] = 1;
arr[3.5] = 2;
arr[3.6] = 3;
console.log(Object.keys(arr).length);

请查看此
length
反映的是最大的数组索引,而不是最大的整数索引。例如,
Object.assign([],{[1e53]:1})。length==0
,但
Object.assign([],{[99]:1}).length===100
@Oriol是的,我试图在答案的第二部分说明这一点,但我同意第一句话是不正确的。我想传达“如果键不是整数,那么它就不符合数组索引的定义”,但我没有做到这一点。我希望我的编辑更好。