提问人:Dixie Flatline 提问时间:4/6/2020 最后编辑:Dixie Flatline 更新时间:4/10/2020 访问量:3476
为什么JS允许数组中的负索引?
Why JS allows negative indices in array?
问:
为什么在 JS 中对数组进行负索引不会引发错误?看起来它不打算在数组中具有负索引的元素:
array.length
不计算具有负索引的元素。array.forEach()
不会遍历具有负索引的元素。
更新。问题不在于“为什么它在理论上是可能的”,而在于“为什么它被设计所允许”。
[已解决]简短的回答:没有特别的原因,只是碰巧变成了这样。
答:
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 objects
a[-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 语句“只是为了让它工作”。并一直保持到现在,不刹车向后兼容性。
评论