为什么JS允许数组中的负索引?

Why JS allows negative indices in array?

提问人:Dixie Flatline 提问时间:4/6/2020 最后编辑:Dixie Flatline 更新时间:4/10/2020 访问量:3476

问:

为什么在 JS 中对数组进行负索引不会引发错误?看起来它不打算在数组中具有负索引的元素:

  • array.length不计算具有负索引的元素。
  • array.forEach()不会遍历具有负索引的元素。

更新。问题不在于“为什么它在理论上是可能的”,而在于“为什么它被设计所允许”。

[已解决]简短的回答:没有特别的原因,只是碰巧变成了这样。

JavaScript的

评论

4赞 Nina Scholz 4/6/2020
数组是一个奇特的对象。任何键都可以。
0赞 palaѕн 4/6/2020
负指数实际上并不像真实指数那样起作用。

答:

0赞 Zachary Haber 4/6/2020 #1

JS 允许数组中的负索引,原因很简单,它们是后台的对象。你也可以放,这将是有效的,但是一个糟糕的主意。[].blah = 5

评论

1赞 Trop 4/6/2020
我认为如果你同时需要一个数组+对象,这并不是一个坏主意。因此,您可以有一个同时具有这两种行为的实例。jQuery为实例使用类似数组的对象,如果您不需要另一个原型链,我认为真正的数组会更好。
1赞 Nikos M. 4/6/2020 #2

Arrays在 JavaScript 中也可以作为(作为 JS 中的几乎所有对象,包括函数)。所以这样做:只需在数组中定义一个新键(作为对象哈希),键值和值。hash objectsa[-1] = -1"-1"-1

您应该知道,javascript 中的几乎所有对象都可以使用。这就是你所看到的。但是,数组的这些键(不是正整数)不算作正常意义上的数组键,而只算作哈希键hash objects

评论

0赞 Dixie Flatline 4/6/2020
合理的观点,尽管 JS 参考声明:数组不能使用字符串作为元素索引(如在关联数组中),但必须使用整数。所以有一种通用数组(称为关联数组),它实际上是一个哈希表。我预计普通数组会对其“数组性”进行更多的强制执行,因为它正在对可能的和索引值进行操作。
0赞 Nikos M. 4/6/2020
@DixieFlatline,哈希键在 js 中作为键传递时会自动转换为字符串。所以做其实就转化成了.并且 simnce js 中的所有对象都可以是哈希对象,这样就完成了。如果数组是正整数,则检查其键并以不同的方式处理它,否则默认为哈希对象功能a[-1]="foo"a["-1"]="foo"
5赞 termosa 4/6/2020 #3

数组是 JavaScript 中特殊类型的对象。它有一个额外的方法和属性列表(如和),并且还有一个已用索引列表(从零开始的整数正数)。 但就像任何其他对象一样,它可以具有其他属性:.length.forEach

var arr = ['A', 'B'];
arr.extra = 'C';
console.log(arr[0], arr[1], arr.extra); // A B C

由于对象属性不仅可以通过点访问,还可以通过方括号访问,因此您可以使用类似数组的语法访问任何属性:

var obj = { extra: 'D' };
console.log(obj['extra']); // D
console.log(arr['extra']); // C

使用相同的语法,您可以分配属性:

obj['x'] = 'E';
obj[33] = 'F';
arr['y'] = 'G';
arr[-1] = 'H';
console.log(obj.x, obj[33], arr.y, arr[-1]); // E F G H

您可以安全地使用数字作为对象的属性名称,它将自动转换为字符串。

唯一的区别是当您使用正整数值作为属性名称时。这些被解释为数组索引。

var arr = [];
arr[0] = 'A';
arr[1] = 'B';
arr[-1] = 'C';
arr.forEach(value => console.log(value)) // A, B
console.log(arr.length); // 2
console.log( Object.keys(arr) ); // ["0", "1", "-1"]

评论

0赞 Dixie Flatline 4/6/2020
好的,我明白了它是如何工作的,从技术角度来看,这是有道理的。尽管如此,它仍然会引起混乱和干扰,因为 JS Reference 指出,实现强制将整数作为索引(键),大概是为了向对象行为添加更多的“数组性”。但是,显然,它并没有强制索引为非负数,这是“数组性”的另一个属性,这在我看来是不连贯的。除非我错过了重点。
0赞 termosa 4/6/2020
它就是这样。JavaScript 不是最可预测的语言。然而,它始终如一地工作。你只需要知道更多的极端情况,以确保代码是安全的。
1赞 termosa 4/6/2020
哦,我读过 UPD。所以,你看,JavaScript 的设计并不好,因为它几乎是由一个开发人员在短期内开发的。也就是说,并不是每个 JavaScript 功能都是计划好的,但有时它只是代码中的一个 if 语句“只是为了让它工作”。并一直保持到现在,不刹车向后兼容性。