在下面的例子中,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 = "";
答案 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 Array
和new 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)
您可以将对象推送到数组,它将自动获得索引(整数)。如果要根据需要添加索引,则要将其作为对象