例如:
var arr = []; arr[3.4] = 1; console.log(arr.length);
在上面的代码示例中,length
属性为零,为什么以及JS解析器内部发生了什么,因为它的长度为零.
数组length
反映了数组中存在的最大数组索引."数组索引"(见下文)是一个属性名称,它是一个小于2 32 -1 的整数值.由于3.4
不是整数,因此设置它不会改变length
.
数组是对象,因此没有理由说数组不能有一个名为的属性3.4
,但该属性不会影响它,length
因为它的名称不符合数组索引的条件.
ES2015 9.4.2,Array Exotic Objects将"数组索引"定义为小于2 32 -1 的整数:
当且仅当ToString(ToUint32(P))等于P并且ToUint32(P)不等于2 32 -1时,属性名P(以String值的形式)是数组索引.
这个定义用于length
价值(强调我的):
每个Array对象都有一个
length
属性,其值始终是小于2 32的非负整数.该length
属性的值在数值上大于每个属性的名称,该属性的名称是数组索引 ; 无论何时创建或更改Array对象的自有属性,都会根据需要调整其他属性以保持此不变量.具体来说,每当添加一个名为数组索引的length
属性时,如果需要,该属性的值将更改为该数组索引的数值之一...