Skip to main content

ES2023

ES2023 重点解决了数组操作的副作用问题,引入了一系列不改变原数组的拷贝方法。

1. 数组的不可变操作方法 (Non-mutating methods)

在以前,使用 sort()reverse()splice() 会直接修改原数组,这在函数式编程或 React/Redux 状态管理中是一个痛点。现在提供了它们的不可变替代版,每次调用都会返回一个新数组副本

  • toSorted():替代 sort()
  • toReversed():替代 reverse()
  • toSpliced():替代 splice()(注意:返回值是修改后的新数组,而不是像 splice 那样返回被删除的元素)
  • with(index, value):替换指定索引处的值,并返回新数组。
const arr = [3, 1, 2];

const sorted = arr.toSorted();
console.log(sorted); // [1, 2, 3]
console.log(arr); // [3, 1, 2] (原数组不受影响)

const newArr = arr.with(1, 99);
console.log(newArr); // [3, 99, 2]

2. 从尾部查找 (findLast / findLastIndex)

以前要从数组末尾查找元素,需要先 reverse() 数组再查找,现在可以直接使用内置方法。

const nums = [1, 2, 3, 4, 5];
// 找到最后一个偶数
const lastEven = nums.findLast(n => n % 2 === 0); // 4
const lastEvenIdx = nums.findLastIndex(n => n % 2 === 0); // 3

3. WeakMap 支持 Symbol 作为 key

以前 WeakMap 的键必须是对象。现在允许使用 Symbol 作为键,这在某些需要唯一标识符来关联内存回收数据的场景非常有用。

const weakMap = new WeakMap();
const sym = Symbol('myKey');
weakMap.set(sym, 'value');

4. Hashbang 语法

正式支持了在文件开头的 #! 语法(通常用于 Unix 脚本),使得 JavaScript 脚本可以直接作为可执行文件运行。

#!/usr/bin/env node
console.log('可以直接执行了!');