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

csbfibhn  于 2022-12-25  发布在  Java
关注(0)|答案(3)|浏览(190)

有人能解释一下这个奇怪的行为吗?为什么第一个例子中的长度是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
6l7fqoea

6l7fqoea1#

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

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

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

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

但请记住我之前说的话:True数组从零开始。因此,JavaScript解释器自动将[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”额外的属性。

6vl6ewon

6vl6ewon2#

length返回1 +对象中最大的整数键。
a中,最大的键是2,所以1+2是3。
b中没有整数键(key1key2中的键不能转换为int),因此Javascript假设最大的键是-1,并且1 + -1产生0
此程序将帮助您了解:

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

dddzy1tm3#

摘自ECMAScript标准,ECMA-262,第5版。

15.4.5.2长度

此Array对象的length属性是一个data属性,其值在数值上始终大于名称为数组索引的每个可删除属性的名称。
注意数组的length属性只考虑数组索引,它是整数;设置其他属性不会影响长度。
对于一个数组,a["3"]等价于a[3](此行为由§ www.example.com指定15.4.5.1); 3是数组索引而不是属性,因此设置a["3"]会影响数组的长度。b["key1"]等价于b.key1。设置属性不会影响集合的长度。

相关问题