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

标签 javascript arrays

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

最佳答案

需要注意的是,常规数组和关联数组之间存在差异。在常规数组(实数组)中,索引必须是整数。另一方面,关联数组可以使用字符串作为索引。如果愿意,您可以将关联数组想象成一张 map 。现在,还要注意,真正的数组总是从零开始。因此,在您的示例中,您按以下方式创建了一个数组:

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

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

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

但请记住我之前说过的话:真正的数组从零开始。因此,javascript 解释器自动将 a[0] 分配给 undefined。在 firebug 或 chrome/safari 控制台中尝试一下,当您尝试打印“a”时,您会看到类似的内容。您应该得到类似“[undefined, Object, Object]”的内容。因此大小为 3 而不是您预期的 2。

在您的第二个示例中,我很确定您正在尝试模拟关联数组的使用,这实际上是向对象添加属性。请记住,关联数组使您能够使用字符串作为键。因此,换句话说,您正在向对象添加一个属性。所以在你的例子中:

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

这实际上意味着:

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

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

关于对象数组上的 Javascript 数组长度不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528680/

相关文章:

javascript - 如何使 DIV 扩展以适应绝对定位的一个元素和固定定位的另一个元素

javascript - 使用 JavaScript/jQuery 在文件浏览对话框中单击打开按钮后获取文件名

php - 数组名称中的大括号变量,PHP

javascript - JS : How to make a for loop out of this?

python - 如何将 spark sql 数据帧转换为 numpy 数组?

javascript - 有没有办法制作 "for loop of for loops"?

javascript - 何时(或如何)使用 RactiveJS 设置 jQuery 事件处理程序?

Java:显示从另一个类中的方法创建的数组

javascript - 在 Node.js 中,为什么使用 require 函数在模块之间变量相等?

c++ - C++ 中的模板化 is_in() 函数(检查数组是否包含字符串)