壁纸神器
122.67M · 2026-04-06
还在用 for 循环反向遍历?还在写 [...arr].reverse() 防止污染原数组?
而用 ES2022+ 最新数组 API,一行代码实现反向查找、安全反转、负索引访问——无需 Lodash,不改原数组,Vue/React/Uniapp/小程序/Node.js 全生态通吃!
如果你受够了:
forEach 嵌套,自己都看不懂reverse() 不小心改了原始数据,引发线上 bugarr[arr.length - 1],有人用 slice,风格混乱那么,这篇 2026 年紧急更新指南,就是为你写的——
不用等 Babel 升级,主流环境已全面支持,今天就能删掉 50% 的冗余代码!
| 需求 | 旧写法 | 新写法(ES2022+) |
|---|---|---|
| 从末尾找第一个匹配元素 | 手动倒序 for / 反转 + find | arr.findLast() |
| 从末尾找第一个匹配索引 | 倒序遍历记录 i | arr.findLastIndex() |
| 安全反转数组(不改原数组) | [...arr].reverse() | arr.toReversed() |
| 获取最后一个元素 | arr[arr.length - 1] | arr.at(-1) |
findLast():从末尾查找,一行搞定场景:找最后一个“已读”消息、最后一个“审核通过”的订单。
const messages = [
{ id: 1, read: false },
{ id: 2, read: true },
{ id: 3, read: false },
{ id: 4, read: true }
];
// 旧:手动倒序 or 反转(易错 + 性能差)
let lastRead = null;
for (let i = messages.length - 1; i >= 0; i--) {
if (messages[i].read) {
lastRead = messages[i];
break;
}
}
// 新:一行搞定!
const lastRead = messages.findLast(msg => msg.read);
console.log(lastRead); // { id: 4, read: true }
<script setup>
import { ref } from 'vue'
const logs = ref([
{ level: 'info' },
{ level: 'error' },
{ level: 'warn' },
{ level: 'error' }
])
// 找最后一个 error 日志
const lastError = logs.value.findLast(log => log.level === 'error')
</script>
findLastIndex():精准定位末尾匹配项索引场景:删除最后一个重复项、高亮最后一个符合条件的列表项。
// Node.js 16+ 支持
const tasks = ['buy milk', 'walk dog', 'buy bread', 'call mom', 'buy eggs'];
// 找最后一个包含 "buy" 的任务索引
const lastIndex = tasks.findLastIndex(task => task.includes('buy'));
if (lastIndex !== -1) {
tasks.splice(lastIndex, 1); // 删除 "buy eggs"
}
console.log(tasks);
// ['buy milk', 'walk dog', 'buy bread', 'call mom']
toReversed():安全反转,永不污染原数组痛点:reverse() 会直接修改原数组,导致难以追踪的 bug。
const original = [1, 2, 3, 4, 5];
// 危险!原数组被修改
const reversed1 = original.reverse();
console.log(original); // [5, 4, 3, 2, 1] ← 原数组变了!
// 安全!原数组不变
const reversed2 = original.toReversed();
console.log(original); // [1, 2, 3, 4, 5] ← 安然无恙
console.log(reversed2); // [5, 4, 3, 2, 1]
function MessageList({ messages }) {
// 安全反转,不影响父组件传入的 messages
const reversedMessages = messages.toReversed();
return (
<ul>
{reversedMessages.map(msg => <li key={msg.id}>{msg.text}</li>)}
</ul>
);
}
at():负索引访问,优雅到哭告别 arr[arr.length - 1] 这种又长又易错的写法!
const arr = ['a', 'b', 'c', 'd', 'e'];
// 旧:繁琐且易出错(比如 length 算错)
const last = arr[arr.length - 1];
const secondLast = arr[arr.length - 2];
// 新:简洁直观
const last = arr.at(-1); // 'e'
const secondLast = arr.at(-2); // 'd'
const first = arr.at(0); // 'a'
find 和 findLastfind()findLast()toReversed() 会改原数组它永远不会修改原数组!如果确实需要修改,请用 reverse()。
| 环境 | 支持情况 |
|---|---|
| Chrome 92+ | |
| Firefox 90+ | |
| Safari 15.4+ | |
| Node.js 16+ | |
| Vue3 / React 18+ | |
| 微信小程序(基础库 2.24.0+) |
at() 越界返回 undefined,不报错const arr = [1, 2];
console.log(arr.at(10)); // undefined
console.log(arr.at(-10)); // undefined
// 需自行判断是否有效
如果项目仍需支持旧环境(如 IE 或低版本 Node),只需:
pnpm add core-js@3
// main.js 或 index.js
import 'core-js/stable';
// 自动补全 findLast、toReversed、at 等 API
findLast 替代手动遍历findLastIndex 定位最新操作core-js,开箱即用新 APItoReversed() 列为推荐写法这些新 API 不是“玩具特性”,而是对 JavaScript 数组操作范式的重大升级。
当你能用 arr.findLast(x => x.valid) 代替 10 行 for 循环,你就知道——这波更新,值了。
各位互联网搭子,要是这篇文章成功引起了你的注意,别犹豫,关注、点赞、评论、分享走一波,让我们把这份默契延续下去,一起在知识的海洋里乘风破浪!