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

IT技术 javascript
2021-01-13 17:39:49

在下面的示例中,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 = "";
6个回答

Javascript 数组不能有“字符串索引”。一个 JavascriptArray是完全数字索引的。当您设置“字符串索引”时,您正在设置对象的属性。这些是等效的:

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' };
嗯,是的,这可以追溯到事实上 JavaScript 中的一切都是一个对象,一个函数是一个对象,并且.表示法和[]访问对象属性表示法实际上都是一样的。尽管如此,在Array对象上设置“字符串索引”并没有使用对象的数组特性Array
2021-03-14 17:39:49
虽然看起来数组和对象相同,但区别在于我们使用数组获得的原型方法与对象不同。我们不能简单地对对象使用 'push' 、 'unshift' 等方法。
2021-03-21 17:39:49
@deceze - 您的评论“在 Array 对象上设置‘字符串索引’没有使用 Array 对象的数组特征”具有误导性。根据以下示例var a = [0] /* a.length is 1 */; a['1'] = 1 /* a.length is now 2 */; a.push(2) /* 'a' now contains three elements 0, 1 and 2 at indices 0, 1 and 2 */
2021-03-25 17:39:49
好吧,公平地说,数字索引也只是对象的属性。如果您使用索引的字符串表示而不是使用数字,则数组工作得很好:var xs = [10, 20, 30]; console.log(xs['1']);
2021-04-09 17:39:49

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

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

出于这个原因,你应该只使用数组来存储由数字索引的东西,如果你想使用字符串作为键,请使用普通对象。另外,作为旁注,使用像[]or{}类的文字来代替new Arrayand是更好的做法new Object

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

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

您不能在null, undefined:P上设置属性此外,一些邪恶的 IE 浏览器对象不允许您设置或获取自定义属性。
2021-03-23 17:39:49

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

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

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

那是因为您正在用length无效的字符串替换数组属性。