最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用 Array.prototype.at() 优雅地获取数组末尾的元素
时间:2026-07-30 15:27:56 编辑:袖梨 来源:一聚教程网
如何用 Array.prototype.at() 优雅地获取数组末尾的元素的重点在于把前置条件、操作顺序和容易误判的地方分清楚。
at(-1) 是获取数组末尾元素最直接安全的方式,空数组返回 undefined 不报错,语义清晰、性能 O(1),TypeScript 类型推导准确,兼容性可通过可选链或 polyfill 降级。
Array.prototype.at() 是获取数组末尾元素最直接的方式,无需计算 length - 1,也比 slice(-1)[0] 更语义清晰、性能略优。
为什么 at(-1) 比 arr[arr.length - 1] 更安全
当数组为空时,arr[arr.length - 1] 返回 undefined,看似无害,但容易掩盖逻辑错误;而 at(-1) 同样返回 undefined,但它明确表达了“取倒数第 1 个”的意图,且支持负索引的语义统一,后续扩展(如 at(-2))更自然。
- 空数组
[]调用at(-1)→undefined,不报错 -
arr[arr.length - 1]在空数组下等价于arr[-1],虽不报错,但属于越界访问,语义模糊 - TypeScript 中
at()的类型推导更准确,能保留T | undefined的联合类型
at() 在稀疏数组和 TypedArray 中的行为差异
at() 是通用数组方法,但不同数组子类实现略有区别:
- 普通数组(
Array)、Uint8Array等TypedArray都支持at() - 稀疏数组(如
new Array(3))中,at(-1)返回undefined(因为索引2不存在),与arr[2]行为一致 -
arguments对象或类数组若未显式继承Array.prototype,需先用Array.from()或[...arguments].at(-1)转换
兼容性处理:不支持 at() 的环境怎么写降级
如果需支持 Safari 15.4 以下或旧版 Node.js(at(),但不必全量 polyfill —— 只需按需补丁:
- 检查是否存在:
if (!Array.prototype.at) { Array.prototype.at = function(n) { return this[n >= 0 ? n : this.length + n] || undefined; }; } - 更稳妥的降级写法(避免负数越界):
arr.at?.(-1) ?? arr[arr.length - 1](可选链 + 空值合并) - 构建工具(如 Babel)开启
core-js/stable/array/at即可自动注入,但注意它会污染全局原型
真正要注意的是:负索引只在 at() 中被标准化,findLast()、findLastIndex() 虽然也用于末尾查找,但它们是遍历行为,复杂度 O(n),而 at(-1) 是 O(1) —— 别为了“看起来更函数式”而误用。
相关文章
- 浮生忆玲珑桂花酱鸡做法 浮生忆玲珑桂花酱鸡攻略 07-30
- 浮生忆玲珑玩法攻略 浮生忆玲珑新手如何玩 07-30
- 浮生忆玲珑珍宝攻略 浮生忆玲珑珍宝如何鉴定 07-30
- 浮生忆玲珑养生粥如何做 浮生忆玲珑养生粥制作攻略 07-30
- 浮生忆玲珑异事触发方法 浮生忆玲珑异事攻略 07-30
- 浮生忆玲珑异闻任务分享 浮生忆玲珑异闻攻略 07-30