ES2023 数组新方法 - 更优雅的数据处理工具#JavaScript #ES2023 #数组方法 #教程 ES2023 带来了一系列实用的数组新方法,它们不仅语法更简洁,还能有效避免常见的编码错误。本文将详细介绍这些新方法,帮助你写出更优雅、更安全的代码。 一、toSorted() - 不改变原数组的排序传统的 sort() 方法会原地修改数组,这在很多场景下会导致意外的副作用。toSorted() 返回一个新数组,保持原数组不变。
|
// 传统 sort - 原地修改
const nums = [3, 1, 4, 1, 5];
nums.sort(); // nums 被改变了!
// toSorted - 返回新数组
const nums = [3, 1, 4, 1, 5];
const sorted = nums.toSorted();
console.log(nums); // [3, 1, 4, 1, 5] 原数组不变
console.log(sorted); // [1, 1, 3, 4, 5] 新数组已排序
|
适用场景:React 状态更新、不可变数据处理、函数式编程。
二、toReversed() - 不改变原数组的反转与 toSorted() 类似,toReversed() 返回反转后的新数组,不修改原数组。
|
const arr = ['a', 'b', 'c', 'd'];
const reversed = arr.toReversed();
console.log(arr); // ['a', 'b', 'c', 'd']
console.log(reversed); // ['d', 'c', 'b', 'a']
|
三、with() - 安全的索引修改with() 方法允许你通过索引修改数组元素,但返回新数组而不是原地修改。这避免了直接赋值 arr[i] = value 的副作用。
|
const arr = ['a', 'b', 'c'];
const newArr = arr.with(1, 'x');
console.log(arr); // ['a', 'b', 'c']
console.log(newArr); // ['a', 'x', 'c']
// 负索引也支持!
const last = arr.with(-1, 'z');
console.log(last); // ['a', 'b', 'z']
|
四、toSpliced() - 不改变原数组的增删toSpliced() 是 splice() 的不可变版本,可以同时删除和插入元素。
|
const months = ['Jan', 'Mar', 'Apr', 'Jun'];
// 在索引 1 处删除 0 个,插入 'Feb'
const withFeb = months.toSpliced(1, 0, 'Feb');
console.log(withFeb); // ['Jan', 'Feb', 'Mar', 'Apr', 'Jun']
// 删除 'Apr' 并插入 'May'
const fixed = months.toSpliced(2, 1, 'May');
console.log(fixed); // ['Jan', 'Mar', 'May', 'Jun']
|
五、findLast() 与 findLastIndex() - 从尾部查找传统 find() 从数组开头查找,而 findLast() 和 findLastIndex() 从数组末尾开始查找,这在很多场景下更加高效和直观。
|
const nums = [1, 2, 3, 4, 3, 2, 1];
// findLast - 找最后一个满足条件的元素
const last3 = nums.findLast(n => n > 2);
console.log(last3); // 3(倒数第三个元素)
// findLastIndex - 找最后一个满足条件的索引
const lastIdx = nums.findLastIndex(n => n === 3);
console.log(lastIdx); // 4
|
典型场景:查找数组中最后一个特定状态(如最后一个错误、最后一个活跃用户等)。
六、实战案例:不可变数据管道结合这些新方法,可以构建优雅的不可变数据处理管道:
|
const products = [
{ id: 1, name: 'A', price: 100 },
{ id: 2, name: 'B', price: 200 },
{ id: 3, name: 'C', price: 150 }
];
// React 风格的状态更新
const updated = products
.toSorted((a, b) => a.price - b.price)
.with(0, { ...products[0], price: 50 });
// 原数组完全不受影响
console.log(products[0].price); // 100
|
七、方法对比速查表
| 旧方法(原地修改) |
新方法(返回新数组) |
用途 |
sort() |
toSorted() |
排序 |
reverse() |
toReversed() |
反转 |
arr[i] = v |
with(i, v) |
索引修改 |
splice() |
toSpliced() |
增删元素 |
find() |
findLast() |
从尾查找 |
findIndex() |
findLastIndex() |
从尾找索引 |
八、浏览器兼容性截至 2026 年,所有主流浏览器的最新版本都已支持这些方法:
- Chrome 110+
- Firefox 115+
- Safari 16+
- Node.js 20+
对于旧环境,可使用 core-js 进行 polyfill。 九、总结ES2023 的数组新方法体现了 JavaScript 向更安全、更函数式方向发展的趋势:
- 不可变性优先 - 新方法返回新数组,避免副作用
- 语法更直观 -
with(i, v) 比 arr[i] = v 更声明式
- 填补空白 -
findLast 解决了"从尾部查找"的常见需求
最佳实践:在 React、Vue 等现代框架中,优先使用这些新方法可以简化状态管理,减少意外 bug。
本文为 JavaScript 日更系列 Week 6 - ES2023 数组新方法 | 作者:墨染 | 虾米团队 |
评论
发表评论