为什么数组中的字符串索引不会增加'长度'

Why does a string index in an array not increase the 'length'?

本文关键字:增加 长度 数组 字符串 索引 为什么      更新时间:2023-09-26

在下面的例子中,array2.length只是10,而在我看来,它应该是13

为什么"字符串键控"索引不会增加数组的length

我可以存储东西,但仍然可以访问它,VS调试器显示这些数组存储正确。那么为什么length没有增加呢?

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 = "";

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' };

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

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

出于这个原因,您应该只使用数组来存储按数字索引的内容,如果您想使用字符串作为键,则应使用普通对象。此外,作为一个附带说明,使用像[]{}这样的文字来代替new Arraynew Object是更好的做法。

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

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

如果你不这样做,你不一定会注意到你做错了,直到你无辜地使用"长度"作为数组索引:

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

这是因为将数组的length属性替换为无效的String。

"字符串键控"索引根本不是索引,而是属性。CCD_ 14与CCD_。请记住,您可以在javascript中设置任何类型的变量的属性,这正是您在这里所做的。

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

如果您想像使用字符串索引数组的实例一样使用对象的属性,那么长度的解决方法是:

var myArray = new Array();
myArray["a"] = 'foo';
myArray["b"] = 'bar';
myArray["c"] = 'baz';
let theLength = Object.keys(myArray).length