Javascript数组长度在对象数组上不正确

有人能解释这个(奇怪的)行为吗? 为什么第一个例子中的长度是3而不是2,最重要的是为什么第二个例子中的长度是0? 只要键是数字,长度的作品。 当它们不是时,长度是0.我怎样才能从第二个例子得到正确的长度? 谢谢。

a = []; a["1"] = {"string1":"string","string2":"string"}; a["2"] = {"string1":"string","string2":"string"}; alert(a.length); // returns 3 b = []; b["key1"] = {"string1":"string","string2":"string"}; b["key2"] = {"string1":"string","string2":"string"}; alert(b.length); // returns 0 

有一点要注意的是常规数组和关联数组之间是有区别的。 在常规数组(实数组)中,索引必须是整数。 另一方面,关联数组可以使用string作为索引。 如果你喜欢,你可以把关联数组想象成一张地图。 现在,请注意,真正的数组总是从零开始。 因此,在你的例子中,你以下面的方式创build了一个数组:

 a = []; a["1"] = {"string1":"string","string2":"string"}; a["2"] = {"string1":"string","string2":"string"} 

Javascript是能够将您的string索引转换为数字,因此,您的代码上面变成:

 a = []; a[1] = {"blah"}; a[2] = {"blah"}; 

但请记住我刚才所说的:真正的数组从零开始。 因此,JavaScript解释器会自动为undefined指定一个[0]。 尝试在萤火虫或铬/ safari控制台,你会看到这样的事情,当你尝试打印“一个”。 你应该得到像“[未定义,对象,对象]。因此,大小3不是你所期望的。

在你的第二个例子中,我很确定你正在试图模拟使用关联数组,这本质上就是将属性添加到对象中。 记住关联的数组使您能够使用string作为关键字。 所以在其他方面,你正在添加一个属性的对象。 所以在你的例子中:

 b["key1"] = {"string1":"string","string2":"string"}; 

这确实意味着:

 b.key1 = {"string1":"string","string2":"string"}; 

初始化b = []只是创build一个数组,但是您的赋值不会填充数组。 它只是给“b”额外的属性。 希望这可以帮助.. :-)

长度返回1 +对象中最大的整数键。

在最大的关键是2,所以1 + 2是3。

b中没有整数键( key1key2不能转换为整数),所以Javascript假定最大的键是-1 1 + -1得到0

这个程序将帮助你看到:

 a = []; a["1"] = {}; a["4"] = {}; alert(a.length); // Prints 5 

从ECMAScript标准,ECMA-262,第5版。

15.4.5.2长度

此Array对象的length属性是一个data属性,其值总是在数值上大于名称为数组索引的每个deletable属性的名称。

注意数组的长度属性只考虑数组索引,它们是整数; 设置其他属性不会影响长度。

对于一个数组, a["3"]相当于a[3] (这个行为由第15.4.5.1节指定)。 3是一个数组索引而不是属性。 因此设置a["3"]会影响数组的长度。 b["key1"]等同于b.key1 。 设置属性不会影响集合的长度。