Array.prototype.at() 提供简洁安全的末尾元素访问方式,支持负索引(如-1取最后一个),空数组返回undefined不报错,比arr[arr.length-1]更健壮且语义清晰。

Array.prototype.at() 提供了一种简洁、安全的方式获取数组末尾元素,无需手动计算 arr.length - 1,尤其适合动态列表(长度可能变化)场景。
直接用负索引访问末尾
`.at()` 支持负数索引,-1 恒指最后一个元素,-2 指倒数第二个,依此类推。无论数组长度如何变化,语义清晰且不会越界返回 undefined(而 arr[arr.length - 1] 在空数组时会访问 arr[-1],结果也是 undefined,但写法冗余且易错)。
-
[1, 2, 3].at(-1)→3 -
['a'].at(-1)→'a' -
[].at(-1)→undefined(安全,不报错)
比 arr[arr.length - 1] 更健壮
传统写法依赖显式长度计算,在逻辑复杂或频繁修改数组的代码中容易出错。例如在异步更新或条件 push/pop 后忘记同步索引;或误写成 arr[arr.length] 导致 undefined 而非预期的末项。
- ✅ 推荐:
list.at(-1)—— 语义即“取最后一个”,与数组当前状态解耦 - ❌ 避免:
list[list.length - 1]—— 多一步计算,可读性弱,易引入 off-by-one 错误
兼容性注意与降级方案
.at() 已被主流浏览器和 Node.js 16.6+ 原生支持。若需兼容旧环境(如 IE 或早期 Node),可用简易 polyfill:
- 一行降级:
arr.at?.(-1) ?? arr[arr.length - 1](利用可选链 + 空值合并) - 或定义一次:
Array.prototype.at ??= function(n) { return this[n
结合动态操作自然使用
在增删频繁的列表逻辑中(如消息队列、撤销栈、实时数据流),.at(-1) 可无缝嵌入,无需关心中间状态:
messages.push(newMsg); const latest = messages.at(-1);history.pop(); const current = history.at(-1);- 配合解构:
const [first, , ...rest] = list; const last = list.at(-1);










