为什么我无法在JavaScript中进行数组[-1]?

时间:2019-01-06 21:48:59

标签: javascript python arrays indexing

在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社区对此表示欢迎。

我想念什么?

4 个答案:

答案 0 :(得分:11)

您错过了这一点,即数组是对象(外来对象),而def find(v, arr, parent = None): if parent is None: parent = [] for idx, item in enumerate(arr): if item == v: # found an item yield parent + [idx] if isinstance(item, list): # found a list, pass it back through the generator yield from find(v, item, parent + [idx]) l = ["foo", ["f", ["b", "c", "d", "a"], "g"], "bar", "a", "g"] list(find('a', l)) # [[1, 1, 3], [3]] list(find('g', l)) # [[1, 2], [4]] list(find('x', l) # doesn't exist # [] 是有效键。

-1

答案 1 :(得分:10)

可以使用arr[-1]-它会尝试访问-1对象上的arr属性,当将奇怪的代码分配给负指数。例如:

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

Javascript属性访问一直以这种方式起作用-因此,进行更改以使[-1]引用数组中最后一个项目会是一个重大更改,这些标准很难避免。 (请记住,由于它们与MooTools的极旧且过时的版本(仅在少数几个网站上仍然不兼容)不兼容,因此他们如何退出Array.prototype.flatten名称?

答案 2 :(得分:3)

因为大多数语言,例如indexOf函数都会返回-1而不是不必要的异常。如果-1是有效索引,则以下代码将导致3而不是undefined

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

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

答案 3 :(得分:2)

使用.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

String中,您还有另一个选择(而不是[0])。

const string = 'ABC'

console.log(string.slice(-1))      // 'C'
console.log(string.slice(-2, -1))  // 'B'
console.log(string.slice(-3, -2))  // 'A'

或使用.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'