对象中的length返回奇怪的值

时间:2017-03-13 16:52:51

标签: javascript

我有一个这样的数组,取自控制台:

[1: 1, 31: 0]
length: 32

这是它的图像(从镀铬控制台中取出)

enter image description here

有这样的数组:

var array = ["foo", "bar", "foobar"]

并使用长度,得出正确答案:3

console.log(array.length); // returns 3

有人可以告诉我,为什么长度为32?我检查了几个SO问题,我知道,对于我想要的价值,我需要这样:

var i = Object.keys(fragenStatusArray).length; // returns 2

但是我仍然不明白为什么长度是32.不计算元素的长度吗?它只是采用最高数字指数并添加前者吗?在检查时,两者都是Object类型。

1 个答案:

答案 0 :(得分:7)

数组的length比最高数组索引属性名称高一个。

由于您拥有属性31,因此length32

relevant section of the specification是:

  

数组对象对某类属性进行特殊处理   名。属性名称P(以String值的形式)是一个数组   索引当且仅当ToString(ToUint32(P))等于P和   ToUint32(P)不等于232-1。属性名称为的属性   数组索引也称为元素。

因此,如果属性名称是数字,则它是数组索引。

  

每个Array对象都有一个   length属性,其值始终是小于的非负整数   232. length属性的值在数值上大于名称为数组索引的每个属性的名称;

然后在最大的数组索引中加1以获得长度。

  

每当一个   创建或更改Array对象的属性,以及其他属性   根据需要进行调整以保持这种不变性。特别,   每当添加名称为数组索引的属性时,长度   如有必要,属性会更改为数字以外的属性   该数组索引的值;每当长度属性是   已更改,每个属性的名称都是数组索引,其值为   不小于新长度会自动删除。这个   约束仅适用于Array对象的自身属性,并且是   不受可能继承的长度或数组索引属性的影响   来自它的原型。

并且只要需要保持正确,长度就会发生变化。