在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社区对此表示欢迎。
我想念什么?
答案 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'