为什么javascript数组中的字符串索引不会增加长度大小?

时间:2012-03-02 01:39:54

标签: javascript

在下面的例子中,array2.length只有十,在我看来,它应该是13.为什么“字符串键入”索引不会增加数组的长度?我可以存储并仍可访问它,VS调试器显示这些数组正确存储。那么为什么长度没有增加?

var array2 = new Array();
array2["a"] = new Array();
array2["b"] = new Array();
array2["c"] = new Array();
for (var i = 0; i < 10; ++i)
    array2[i] = new Array();

var nothing = "";
for (var i = 0; i < array2.length; ++i)
    nothing = "";

6 个答案:

答案 0 :(得分:91)

Javascript数组不能包含“字符串索引”。 Javascript Array仅以数字方式编入索引。设置“字符串索引”时,您将设置对象的属性。这些是等价的:

array.a = 'foo';
array['a'] = 'foo';

这些属性不属于数组的“数据存储”。

如果你想要“关联数组”,你需要使用一个对象:

var obj = {};
obj['a'] = 'foo';

也许最简单的可视化使用文字符号而不是new Array

// numerically indexed Array
var array = ['foo', 'bar', 'baz'];

// associative Object
var dict = { foo : 42, bar : 'baz' };

答案 1 :(得分:12)

因为长度是defined to be加上数组中最大的数字索引。

var xs = [];
xs[10] = 17;
console.log( xs.length ); //11

出于这个原因,你应该只使用数组存储由数字索引的内容,如果你想使用字符串作为键,则使用普通对象。另外,作为旁注,更好的做法是使用[]{}等文字而不是new Arraynew Object

答案 2 :(得分:8)

您没有向数组中添加项目;您正在向Array对象添加属性。

答案 3 :(得分:2)

“字符串键控”索引根本不是索引,而是属性。 array2["a"]array2.a相同。请记住,您可以在javascript中设置任何类型变量的属性,这正是您在此处所做的。

答案 4 :(得分:1)

如上所述,将对象用于关联数组。

如果你没有被告知你做错了,直到你无辜地使用&#34;长度&#34;作为数组索引:

var myArray = [];
myArray["foo"] = "bar"; //works
console.log(myArray["foo"]) //print "bar"
myArray["length"] = "baz" //crash with a "RangeError: Invalid array length"

这是因为您正在使用String替换数组的length属性,这是无效的。

答案 5 :(得分:0)

您可以将对象推送到数组,它将自动获得索引(整数)。如果要根据需要添加索引,则要将其作为对象