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
中没有整数键( key1
和key2
不能转换为整数),所以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
。 设置属性不会影响集合的长度。