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

Dav*_*ave 46 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 = "";
Run Code Online (Sandbox Code Playgroud)

dec*_*eze 100

Javascript数组不能有"字符串索引".Javascript Array完全用数字索引.设置"字符串索引"时,您将设置对象的属性.这些是等价的:

array.a = 'foo';
array['a'] = 'foo';
Run Code Online (Sandbox Code Playgroud)

这些属性不是数组"数据存储"的一部分.

如果需要"关联数组",则需要使用对象:

var obj = {};
obj['a'] = 'foo';
Run Code Online (Sandbox Code Playgroud)

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

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

// associative Object
var dict = { foo : 42, bar : 'baz' };
Run Code Online (Sandbox Code Playgroud)

  • 嗯,公平地说,数字索引也只是对象的属性.如果使用索引的字符串表示而不是使用数字,则数组工作正常:`var xs = [10,20,30]; 的console.log(XS [ '1']);` (7认同)
  • 是的,这可以追溯到这样一个事实,即Javascript中的几乎所有东西都是一个对象,一个函数是一个对象,而`.`符号和`[]`访问对象属性的符号实际上都是一样的.仍然,在`Array`对象上设置"字符串索引"不使用`Array`对象的数组特征. (4认同)
  • 虽然看起来数组和对象相同,但区别在于我们使用数组获得的原型方法与对象不同。我们不能简单地对对象使用诸如 'push' 、 'unshift' 等方法。 (2认同)
  • @deceze - 您的评论“在 Array 对象上设置‘字符串索引’没有使用 Array 对象的数组特征”具有误导性。根据以下示例`var a = [0] /* a.length is 1 */; a['1'] = 1 /* a.length 现在为 2 */; a.push(2) /* 'a' 现在在索引 0、1 和 2 处包含三个元素 0、1 和 2 */` (2认同)

hug*_*omg 12

因为长度被定义为一个加上数组中最大的数字索引.

var xs = [];
xs[10] = 17;
console.log( xs.length ); //11
Run Code Online (Sandbox Code Playgroud)

因此,如果要将字符串用作键,则应仅使用数组来存储由数字索引的内容,而使用普通对象.另外,作为旁注,使用像[]{}代替new Array和的文字是更好的做法new Object.


sje*_*397 8

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