有人能解释一下这种(奇怪的)行为吗?为什么第一个例子中的长度是3而不是2,最重要的是,为什么第二个例子中的长度是0?只要键是数字的,length就有效。如果不是,则长度为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
发布于 2010-03-27 18:27:48
需要注意的一点是,常规数组和关联数组是有区别的。在常规数组(实数组)中,索引必须是整数。另一方面,关联数组可以使用字符串作为索引。如果愿意,您可以将关联数组视为一个映射。现在,还要注意,真正的数组总是从零开始。因此,在您的示例中,您以以下方式创建了一个数组:
a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}
Javascript能够将字符串索引转换为数字,因此,上面的代码变为:
a = [];
a[1] = {"blah"};
a[2] = {"blah"};
但请记住我前面所说的:真正的数组从零开始。因此,javascript解释器自动将a赋值给未定义的。在firebug或chrome/safari控制台中试用它,当您尝试打印"a“时,您将看到类似下面的内容。你应该会得到类似于"undefined,Object,Object.因此大小是3而不是你期望的2“之类的东西。
在您的第二个示例中,我非常确定您正在尝试模拟关联数组的使用,这本质上是向对象添加属性。记住,关联的数组使您能够将字符串用作键。因此,换句话说,您是在向对象添加属性。因此,在您的示例中:
b["key1"] = {"string1":"string","string2":"string"};
这实际上意味着:
b.key1 = {"string1":"string","string2":"string"};
初始化b =[]只是创建一个数组,但是您的赋值不会填充该数组。它只是给了"b“额外的属性。希望这能帮上忙..:-)
发布于 2010-03-27 17:02:07
length返回1+对象中最大的整数键。
在a
中,最大的键是2,所以1+2是3。
在b
中没有整数键(那里的键是key1
和key2
,它们不能转换为In ),所以Javascript假设最大的键是-1
,而1 + -1
产生0
。
此程序将帮助您了解以下内容:
a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5
https://stackoverflow.com/questions/2528680
复制相似问题