为什么我不能在JavaScript中执行数组[-1]?

Nin*_*liu -3 javascript python arrays indexing

在Python中,您可以这样做:

arr = [1,2,3]
arr[-1] // evaluates to 3
Run Code Online (Sandbox Code Playgroud)

但是在JS中,你不能:

let arr = [1,2,3];
arr[-1]; // evaluates to undefined
Run Code Online (Sandbox Code Playgroud)

问题是:为什么?

我知道绕过它的技巧(arr[arr.length-1]修改数组原型等),但这不是重点.

我试图理解为什么它仍然没有在EcmaScript标准中将负数组索引解释为从最后开始的索引,尽管实现一个理解它的JS引擎似乎很容易(而且整个Python社区也是如此)用这种表示方法爆炸).

我错过了什么?

Nin*_*olz 12

你忽略了这一点,即数组是对象(异国情调的对象)并且-1是一个有效的密钥.

var array = [1, 2, 3];

array[-1] = 42;

console.log(array);
console.log(array[-1]);
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 10

可以使用arr[-1]- 它将尝试访问对象-1上的arr属性,这在将奇怪的代码分配给负索引时是可能的.例如:

const arr = [1,2,3]
arr[-1] = 'foo';
console.log(arr[-1]);
Run Code Online (Sandbox Code Playgroud)

Javascript属性访问一直以这种方式工作 - 因此,更改事物以便[-1]引用数组中最后一项将是一个重大变化,标准很难避免.(还记得他们是如何支持的出Array.prototype.flatten名字,由于具有非常旧的和过时的版本,这在只有少数网站仍存在MooTools的不相容-这将是差远了)


Mir*_*ili 8

更新:

.at()方法现在在某些环境中可用(Chrome 92+Firefox 90+)。希望很快在所有环境中。

at()方法接受一个整数值并返回该索引处的项目,允许正整数和整数。负整数从数组中的最后一项开始计数。

请参阅:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at

(提案在这里。)

检查您的浏览器是否支持它:

const array = [1, 2, 3]

try {
    console.log(array.at(-1))  // 3
    console.log(array.at(-2))  // 2
    console.log(array.at(-3))  // 1
} catch (e) {
    console.error("Sorry! Your browser doesn't support this feature yet!")
}
Run Code Online (Sandbox Code Playgroud)

兼容性


使用.slice(-N)[0]

const array = [1, 2, 3]

console.log(array.slice(-1)[0])  // 3
console.log(array.slice(-2)[0])  // 2
console.log(array.slice(-3)[0])  // 1
Run Code Online (Sandbox Code Playgroud)

Strings 你有另一个选择(而不是[0])。

const string = 'ABC'

console.log(string.slice(-1))      // 'C'
console.log(string.slice(-2, -1))  // 'B'
console.log(string.slice(-3, -2))  // 'A'
Run Code Online (Sandbox Code Playgroud)

或使用.substr(-N, 1)

const string = 'ABC'

console.log(string.substr(-1))     // 'C'
console.log(string.substr(-2, 1))  // 'B'
console.log(string.substr(-3, 1))  // 'A'
Run Code Online (Sandbox Code Playgroud)