ES2023 到 ES2025:已经进入日常的实用新特性
ES2023 到 ES2025:已经进入日常的实用新特性
ES 标准每年一更,但真正能进日常开发的就那么几个。翻了下自己这两年的代码,挑出没再写过 polyfill 也没怎么刻意记、却已经用得很自然的几个。
ES2023:数组的收尾操作
// findLast / findLastIndex:从后往前找
const lastError = logs.findLast((log) => log.level === 'error')
// toSorted / toReversed / toSpliced / with:不可变版本
const sorted = list.toSorted((a, b) => a.score - b.score) // list 不变
const reversed = list.toReversed()
const updated = list.with(2, newValue) // 替换索引 2,返回新数组
toSorted 这组"Copying 方法"是配合不可变数据流(React/Vue 的状态更新)的刚需。以前要么先 [...list].sort(),要么装 lodash,现在原生了。
Array.prototype.with 名字有点怪,但 arr.with(i, v) 比 Object.assign([], arr, { [i]: v }) 这种写法顺眼太多。
ES2024:分组与 Promise 补强
// Object.groupBy:按条件分组,一行顶过去一段 reduce
const byLevel = Object.groupBy(logs, (log) => log.level)
// { error: [...], warn: [...], info: [...] }
// Map.groupBy 同理,分组结果放 Map 里,键可以是任意类型
const byUser = Map.groupBy(orders, (o) => o.userId)
Object.groupBy 返回值是 null 原型对象,解构随便用,当 Map 折腾 key 时记得还有 Map.groupBy。
// Promise.withResolvers:把"完成权"拿到外面
const { promise, resolve, reject } = Promise.withResolvers()
dialog.on('confirm', resolve)
dialog.on('cancel', reject)
await promise // 等用户在弹窗里做选择
以前要实现"在某个回调里 resolve 外面的 Promise",得写个别扭的 executor 把 resolve 存到外面变量,现在一行搞定。写 UI 交互、WebSocket 消息配对这类"事件触发型 Promise"特别顺手。
Set 也终于有了集合运算:
const a = new Set([1, 2, 3, 4])
const b = new Set([3, 4, 5])
a.intersection(b) // Set { 3, 4 }
a.union(b) // Set { 1, 2, 3, 4, 5 }
a.difference(b) // Set { 1, 2 }
a.isSubsetOf(b) // false
权限校验("用户权限是否为所需权限的超集")这类代码直接可读性翻倍。
ES2025:迭代器终于能链式调用了
Iterator Helpers 是我个人体感最实用的一批:
// map 的 values 是迭代器,以前要先 [...map.values()] 才能 map/filter
const names = map
.values()
.filter((u) => u.active)
.map((u) => u.name)
.take(10)
.toArray()
迭代器直接挂上了 map、filter、take、drop、toArray 等方法,而且是惰性求值——不调用 toArray/take 触发消费就不会真的遍历,处理大数据集比先转数组再链式调用省内存。
其他值得一提的:
Promise.try(fn):把"可能是同步也可能是异步"的函数统一包成 Promise,混用时代码清爽很多- 正则
RegExp.escape():拼动态正则前转义用户输入,终于不用自己维护了 - Import Attributes(
import data from './x.json' with { type: 'json' }):JSON 模块正式落地
兼容性怎么办
这些特性 Chrome/Edge/Safari/Firefox 近两年版本全齐了,Node 20+ 也基本覆盖。项目里如果还要照顾老浏览器,构建工具的 browserslist 配好,core-js 会自动按需补;服务端代码直接放心用。
每年新语法很多,但值得养成的习惯就一个:碰到"这功能不会原生生了吧"的念头时去 MDN 查一眼——这几年经常真有惊喜。
看到这里了?如果这篇文章帮到过你
请我喝瓶可乐就好 🥤

评论0 条
还没有评论,来抢沙发~