at() 方法是 ES2022 引入的数组原生方法,专为支持负索引而设计,能直接、安全地访问末尾元素,无需手动计算 length,且兼容类数组对象和字符串,性能优于 slice(-1)[0]。

at() 方法是 ES2022 引入的数组原生方法,专为支持负索引而设计,能直接、安全地访问末尾元素,无需手动计算 length。
为什么 at() 比传统方式更优雅
过去取最后一个元素常用 arr[arr.length - 1],倒数第二个要写 arr[arr.length - 2],既冗长又易出错(比如空数组时访问 arr[-1] 会返回 undefined,但逻辑上不直观)。at() 统一用负数表示“从末尾开始计数”:-1 是最后一个,-2 是倒数第二个,以此类推。
-
[1, 2, 3].at(-1)→3 -
[1, 2, 3].at(-2)→2 -
[].at(-1)→undefined(安全,不报错)
支持所有类数组对象
除了普通数组,at() 还可用于 TypedArray、String、甚至带 length 和数字索引的类数组对象(只要实现了 @@isConcatSpreadable 或有相应原型链)。
-
"hello".at(-1)→"o" -
new Uint8Array([10, 20, 30]).at(-2)→20 -
Array.prototype.at.call({0: 'a', 1: 'b', length: 2}, -1)→"b"
和 slice(-1)[0] 对比:更轻量、语义更清晰
有人用 arr.slice(-1)[0] 模拟负索引,但它会新建数组,带来额外开销;at() 是单次查找,无中间数组,性能更好,且意图一目了然。
-
[1,2,3,4].slice(-2)[0]→ 创建新数组[3,4],再取第 0 项 →3 -
[1,2,3,4].at(-2)→ 直接定位索引length + (-2) = 2→3
兼容性与降级建议
现代浏览器和 Node.js 16.6+ 均已支持。如需兼容旧环境,可简单 polyfill:
if (!Array.prototype.at) {<br> Array.prototype.at = function(n) {<br> const len = this.length;<br> return n >= 0 ? this[n] : this[len + n];<br> };<br>}注意:该 polyfill 不处理稀疏数组的严格行为,但覆盖绝大多数日常场景。

















