在Python中,您可以这样做:
arr = [1,2,3]
arr[-1] // evaluates to 3
但是在JS中,你不能:
let arr = [1,2,3];
arr[-1]; // evaluates to undefined
问题是:为什么?
我知道绕过它的技巧(arr[arr.length-1]
,修改数组原型等),但这不是重点。
我试图理解为什么它仍然没有在EcmaScript标准中将负数组索引解释为从最后开始的索引,尽管实现一个理解它的JS引擎似乎很容易(而且整个Python社区也是如此)用这种表示方法爆炸)。
我错过了什么?
你错过了重点,数组是对象(异国情调的对象),-1
是一个有效的密钥。
var array = [1, 2, 3];
array[-1] = 42;
console.log(array);
console.log(array[-1]);
您可以使用arr[-1]
- 它将尝试访问-1
对象上的arr
属性,这在将奇怪的代码分配给负索引时是可能的。例如:
const arr = [1,2,3]
arr[-1] = 'foo';
console.log(arr[-1]);
Javascript属性访问一直以这种方式工作 - 因此,更改内容以便[-1]
将引用数组中的最后一项将是一个重大变化,标准很难避免。 (还记得他们是如何退出Array.prototype.flatten
名称的,因为与一个极其古老而过时的MooTools版本不兼容,而MooTools只存在于少数网站上 - 这会更糟糕)
因为大多数语言如indexOf
函数返回-1
而不是一个不必要的异常。如果-1
是一个有效的索引,那么下面的代码将导致3
而不是undefined
。
var arr = [1,2,3]
console.log(arr[arr.indexOf(4)])
恕我直言,Python通过使负面索引有效而犯了一个错误,因为它会导致许多不直接直观的奇怪后果。