at() 专为安全获取数组元素设计:arr.at(-1) 直接取末尾元素,空数组返回 undefined 而不报错,且明确支持负索引语义,对稀疏数组行为一致,不改变原数组。

at() 就是为这事设计的:直接用 arr.at(-1) 取末尾元素,不用算 arr.length - 1,也不用担心空数组报错(它返回 undefined)。
为什么 at(-1) 比 arr[arr.length - 1] 更安全
手动计算下标在空数组或稀疏数组里容易出问题:
-
[]时,arr[arr.length - 1]等价于arr[-1],结果是undefined—— 表面看没报错,但逻辑上你本意是“取最后一个”,而-1是无效属性访问,不是有意的负向索引 -
[1,,3](含空位)时,arr[arr.length - 1]能取到3,但这是靠长度碰巧对齐;若你误以为数组是密集的,后续操作可能隐含 bug -
at()明确支持负索引语义:从末尾开始计数,-1永远是最后一个,-2是倒数第二个,且对稀疏数组行为一致
at() 在空数组和边界情况下的表现
它不抛错,统一返回 undefined,这点比 slice(-1)[0] 或 pop() 更干净:
-
[].at(-1)→undefined -
[42].at(-1)→42 -
[1,2,3].at(-10)→undefined(越界不报错) -
[1,2,3].at(10)→undefined(正向越界同理)
注意:at() 不改变原数组,也不触发 getter/setter,纯读取。
兼容性与降级方案(别盲目 polyfill)
Chrome 92+、Firefox 90+、Safari 15.4+ 原生支持;Node.js 16.6+。旧环境需谨慎处理:
- 如果项目已用 Babel,启用
@babel/plugin-proposal-at-method即可转换,它会转成length计算逻辑 - 手写降级别直接用
arr[arr.length + n](n 为负数),因为对稀疏数组行为不一致;推荐:n - 不要用
slice(n, n+1)[0]降级——创建新数组有额外开销,且slice(-1)[0]对空数组也返回undefined,看似一样,但语义模糊、性能差
真正要注意的是:负索引只在 at() 里是语言级语义,其他数组方法(如 slice、splice)的负数参数是历史遗留行为,解释方式略有不同;混用时容易误判边界。

















