对象数组中的JavaScript数组长度不正确

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (7)

有人可以解释这种(奇怪的)行为吗?为什么第一个例子中的长度是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
提问于
用户回答回答于

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

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

Javascript能够将字符串索引转换为数字,因此,您的代码变为:

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

但请记住我之前说过的:真正的数组从零开始。因此,JavaScript解释器会自动为undefined指定一个[0]。在Firebug或Chrome / Safari游戏控制台中尝试一下,当你尝试打印“a”时你会看到类似的东西。你应该得到像“[未定义,对象,对象]。因此,大小3不是你想象的那样。

在你的第二个例子中,我非常肯定你正在试图模拟使用关联数组,这实质上就是向对象添加属性。记住关联的数组使你能够使用字符串作为关键字。所以换句话说,你正在向对象添加一个属性。所以在你的例子中:

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

这确实意味着:

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

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

用户回答回答于

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

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

b没有整数键(键有key1key2不能被转换成整数)这样的Javascript假定最大关键是-1,和1 + -1产量0

这个程序将帮助你看到:

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

扫码关注云+社区