我有一个这样的数组,取自控制台:
[1: 1, 31: 0]
length: 32
这是它的图像(从镀铬控制台中取出)
有这样的数组:
var array = ["foo", "bar", "foobar"]
并使用长度,得出正确答案:3
console.log(array.length); // returns 3
有人可以告诉我,为什么长度为32?我检查了几个SO问题,我知道,对于我想要的价值,我需要这样:
var i = Object.keys(fragenStatusArray).length; // returns 2
但是我仍然不明白为什么长度是32.不计算元素的长度吗?它只是采用最高数字指数并添加前者吗?在检查时,两者都是Object
类型。
答案 0 :(得分:7)
数组的length
比最高数组索引属性名称高一个。
由于您拥有属性31
,因此length
为32
。
relevant section of the specification是:
数组对象对某类属性进行特殊处理 名。属性名称P(以String值的形式)是一个数组 索引当且仅当ToString(ToUint32(P))等于P和 ToUint32(P)不等于232-1。属性名称为的属性 数组索引也称为元素。
因此,如果属性名称是数字,则它是数组索引。
每个Array对象都有一个 length属性,其值始终是小于的非负整数 232. length属性的值在数值上大于名称为数组索引的每个属性的名称;
然后在最大的数组索引中加1以获得长度。
每当一个 创建或更改Array对象的属性,以及其他属性 根据需要进行调整以保持这种不变性。特别, 每当添加名称为数组索引的属性时,长度 如有必要,属性会更改为数字以外的属性 该数组索引的值;每当长度属性是 已更改,每个属性的名称都是数组索引,其值为 不小于新长度会自动删除。这个 约束仅适用于Array对象的自身属性,并且是 不受可能继承的长度或数组索引属性的影响 来自它的原型。
并且只要需要保持正确,长度就会发生变化。