有人可以解释这种(奇怪的)行为吗?为什么第一个例子中的长度为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
答案 0 :(得分:88)
需要注意的是,常规数组和关联数组之间存在差异。在常规数组(实数组)中,索引必须是整数。另一方面,关联数组可以使用字符串作为索引。如果您愿意,可以将关联数组视为地图。现在,还要注意,真正的数组总是从零开始。因此,在您的示例中,您使用以下方式创建了一个数组:
a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}
Javascript能够将您的字符串索引转换为数字,因此,您的上述代码变为:
a = [];
a[1] = {"blah"};
a[2] = {"blah"};
但请记住我之前所说的:真正的数组从零开始。因此,javascript解释器自动将[0]分配给undefined。在firebug或chrome / safari控制台中尝试一下,当你尝试打印“a”时,你会看到类似的东西。您应该得到类似“[undefined,Object,Object]”的内容。因此,大小3不是您所期望的那样。
在您的第二个示例中,我非常确定您正在尝试模拟关联数组的使用,这主要是向对象添加属性。记住关联的数组使您可以使用字符串作为键。因此,换句话说,您正在向对象添加属性。所以在你的例子中:
b["key1"] = {"string1":"string","string2":"string"};
这确实意味着:
b.key1 = {"string1":"string","string2":"string"};
初始化b = []只是创建一个数组,但是你的赋值不会填充数组。它只是给出了“b”额外的属性。希望这有助于......: - )
答案 1 :(得分:17)
length返回1 +对象中最大的整数键。
在a
中,最大的密钥为2,因此1 + 2为3。
在b
中没有整数键(key1
和key2
的键无法转换为整数)因此Javascript假设最大键为-1
,1 + -1
会产生0
。
此计划将帮助您了解:
a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5
答案 2 :(得分:9)
来自ECMAScript标准,ECMA-262,第5版。
15.4.5.2长度
此Array对象的length属性是一个data属性,其值始终在数值上大于名称为数组索引的每个deletable属性的名称。
注意数组的length属性只考虑数组索引,它们是整数;设置其他属性不会影响长度。
对于数组,a["3"]
等同于a[3]
(此行为由第15.4.5.1节指定); 3是数组索引而不是属性。因此,设置a["3"]
会影响数组的长度。 b["key1"]
相当于b.key1
。设置属性不会影响集合的长度。