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

问题描述 投票:-3回答:3

在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社区也是如此)用这种表示方法爆炸)。

我错过了什么?

javascript python arrays indexing
3个回答
11
投票

你错过了重点,数组是对象(异国情调的对象),-1是一个有效的密钥。

var array = [1, 2, 3];

array[-1] = 42;

console.log(array);
console.log(array[-1]);

10
投票

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

const arr = [1,2,3]
arr[-1] = 'foo';
console.log(arr[-1]);

Javascript属性访问一直以这种方式工作 - 因此,更改内容以便[-1]将引用数组中的最后一项将是一个重大变化,标准很难避免。 (还记得他们是如何退出Array.prototype.flatten名称的,因为与一个极其古老而过时的MooTools版本不兼容,而MooTools只存在于少数网站上 - 这会更糟糕)


3
投票

因为大多数语言如indexOf函数返回-1而不是一个不必要的异常。如果-1是一个有效的索引,那么下面的代码将导致3而不是undefined

var arr = [1,2,3]
console.log(arr[arr.indexOf(4)])

恕我直言,Python通过使负面索引有效而犯了一个错误,因为它会导致许多不直接直观的奇怪后果。

© www.soinside.com 2019 - 2024. All rights reserved.