首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对象数组上的Javascript数组长度不正确

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

Stack Overflow用户
提问于 2010-03-27 16:52:46
回答 2查看 49.6K关注 0票数 60

有人能解释一下这种(奇怪的)行为吗?为什么第一个例子中的长度是3而不是2,最重要的是,为什么第二个例子中的长度是0?只要键是数字的,length就有效。如果不是,则长度为0。如何从第二个示例中获得正确的长度?谢谢。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-27 18:27:48

需要注意的一点是,常规数组和关联数组是有区别的。在常规数组(实数组)中,索引必须是整数。另一方面,关联数组可以使用字符串作为索引。如果愿意,您可以将关联数组视为一个映射。现在,还要注意,真正的数组总是从零开始。因此,在您的示例中,您以以下方式创建了一个数组:

代码语言:javascript
复制
a = [];
a["1"] = {"string1":"string","string2":"string"};
a["2"] = {"string1":"string","string2":"string"}

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

代码语言:javascript
复制
a = [];
a[1] = {"blah"};
a[2] = {"blah"};

但请记住我前面所说的:真正的数组从零开始。因此,javascript解释器自动将a赋值给未定义的。在firebug或chrome/safari控制台中试用它,当您尝试打印"a“时,您将看到类似下面的内容。你应该会得到类似于"undefined,Object,Object.因此大小是3而不是你期望的2“之类的东西。

在您的第二个示例中,我非常确定您正在尝试模拟关联数组的使用,这本质上是向对象添加属性。记住,关联的数组使您能够将字符串用作键。因此,换句话说,您是在向对象添加属性。因此,在您的示例中:

代码语言:javascript
复制
b["key1"] = {"string1":"string","string2":"string"};

这实际上意味着:

代码语言:javascript
复制
b.key1 = {"string1":"string","string2":"string"};

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

票数 95
EN

Stack Overflow用户

发布于 2010-03-27 17:02:07

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

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

b中没有整数键(那里的键是key1key2,它们不能转换为In ),所以Javascript假设最大的键是-1,而1 + -1产生0

此程序将帮助您了解以下内容:

代码语言:javascript
复制
a = [];
a["1"] = {};
a["4"] = {};
alert(a.length); // Prints 5
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2528680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档