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的不相容-这将是差远了)
.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]) // 1Run 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)
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |