ES2026 第 17 版新增的 5 个新特性

每年更新的 ECMAScript 标准持续优化 JavaScript 语言细节,2026 版 ES2026 并未推出颠覆性重磅功能,而是针对性补齐了前端开发者长期遇到的各类编码短板。本文详解 ES2026 五大实用新特性,对比新旧写法,梳理错误判断、数值计算、Map 操作、异步遍历、二进制转换的优化升级,全方位展示本次版本的实用性改进。
一、判断 Error,不用再猜了
前端在实际开发的过程中你肯定写过 try/catch。
但你有没有遇到过这种情况:
你 catch 到了一个东西,却不确定它到底是不是一个真正的 Error。
有时别人会直接 throw 一个普通对象。
有时错误来自不同 iframe、worker 或 JavaScript realm。
这时候,instanceof Error 就不一定可靠。
因为每个 realm 都有自己的 Error 构造函数。
以前我们可能会这样写:
// 旧写法:跨 realm 时可能判断错误
function isError(err) {
return err instanceof Error;
}
代码看起来没问题。但如果错误来自另一个 iframe,这个判断可能会返回 false。
哪怕它确实是一个合法 Error。
ES2026 新增了:
Error.isError()
新写法是:
// 新写法:不管错误来自哪里,都更一致
function isError(err) {
return Error.isError(err);
}
这个变化看起来很小。
但如果你的应用涉及多个模块、iframe、web worker,或者复杂运行环境,它能减少一类非常难排查的 bug。
以前你以为自己抓到的是普通对象,其实只是 instanceof 被 realm 搞翻了。现在,语言层面终于给了一个更可靠的判断方式。
二、数字求和,不该这么容易出错
JavaScript 的数字使用 IEEE 754 浮点数,这件事本身没问题。
问题是,当你不断累加小数时,精度误差会慢慢出现。
经典例子:
// 旧写法:精度误差会累积 const numbers = [0.1, 0.2, 0.3]; const total = numbers.reduce((a, b) => a + b, 0); console.log(total); // 0.6000000000000001
你想要的是 0.6。
JavaScript 给你的是:
0.6000000000000001
三个数字的时候,这点误差看起来没什么。
但如果你在处理几千行交易数据、统计数据、账单、报表,这种小误差就可能变成真问题。
尤其是金融场景。
ES2026 新增了:
Math.sumPrecise()
它专门用来对数组里的数字进行更高精度求和。
// 新写法:更精确 const total = Math.sumPrecise([0.1, 0.2, 0.3]); console.log(total); // 0.6
这不是炫技功能,这是非常实用的补洞。
如果你的业务对数值准确性敏感,这个 API 会少写很多补丁代码。
也少掉很多“为什么总数多了一点点”的尴尬问题。
三、Map 终于不用先 has 再 set 了
只要你用过 Map,一定写过这种代码:
// 旧写法:每次都要手动判断
if (!map.has(key)) {
map.set(key, []);
}
const list = map.get(key);
这个模式太常见了。
先判断 key 存不存在,不存在就塞一个默认值。然后再取出来继续用。写一次还能接受,写十次就开始烦。
ES2026 新增了:
Map.prototype.getOrInsert()
现在可以一行搞定:
// 新写法:不存在就插入,并立刻返回值 const list = map.getOrInsert(key, []);
逻辑更清楚,代码也更短。
如果默认值构造成本比较高,比如要创建一个很重的对象,也可以用:
getOrInsertComputed()
它接收一个函数,只有在 key 不存在时才会真正执行。
const set = map.getOrInsertComputed(key, () => new Set());
这就避免了无意义的对象创建。
更好的是,这两个方法不只适用于 Map,WeakMap 也支持。
这类 API 看起来不惊艳,但它会让大量业务代码更干净。尤其是你在做分组、缓存、索引、依赖关系收集时,会经常用到。
四、收集 async iterable,不用手写循环了
Array.from()很好用,它可以把 iterable 转成普通数组。
但问题是:它不适用于async iterable。
比如:
- stream。
- async generator。
- 分页 API 返回的数据。
- 异步数据源。
以前你要把 async iterable 收集成数组,大概得这么写:
// 旧写法:手动 for await 收集
async function collectAll(asyncIterable) {
const result = [];
for await (const item of asyncIterable) {
result.push(item);
}
return result;
}
能用,但每次都要写这套仪式感。
ES2026 新增了:
Array.fromAsync()
新写法非常直接:
// 新写法:一行收集 async iterable const result = await Array.fromAsync(asyncIterable);
如果你经常处理分页 API、异步生成器、流式数据,这个功能会明显减少样板代码。
以前你只是想要一个数组,结果被迫写一段循环。
现在终于可以一行解决,这就是标准库该做的事。
五、二进制转 base64 / hex
做文件上传、加密、图片处理、二进制协议时,经常要在 Uint8Array 和 base64 字符串之间转换。
以前写起来很丑。
比如转 base64:
// 旧写法:btoa + 手动字符转换
function toBase64(bytes) {
let binary = "";
bytes.forEach((b) => {
binary += String.fromCharCode(b);
});
return btoa(binary);
}
这套写法不仅啰嗦,还容易出问题。
尤其是字符超出 btoa 支持范围时,很容易踩坑。
ES2026 直接给 Uint8Array 增加了原生方法。
const bytes = new Uint8Array([72, 101, 108, 108, 111]); console.log(bytes.toBase64()); // "SGVsbG8=" console.log(bytes.toHex()); // "48656c6c6f"
反过来也可以:
const decoded = Uint8Array.fromBase64("SGVsbG8=");
这类功能不会上热搜。
但它会让代码变短、变清楚、变不容易出错。
尤其是你做 Web Crypto、文件处理、上传下载、图片转码时,会很常用。
以前那些String.fromCharCode小技巧,终于可以少写了。
总结
ES2026 官方确认的新功能,没有标题党说得那么夸张。它不会彻底改变 JavaScript,也不会逼你马上迁移项目,但它确实补上了几个长期存在的小缺口。
这 5 个最值得记:
Error.isError():跨 realm 判断 Error 更可靠。Math.sumPrecise():小数求和更精确,减少浮点误差。Map.prototype.getOrInsert():Map / WeakMap 不用再手写 has + set。Array.fromAsync():一行收集 async iterable。Uint8Array base64 / hex方法:二进制编码转换不用再手搓。
ES2026 的更新聚焦日常前端开发痛点,以轻量化、实用性优化为主,有效解决了浮点精度误差、跨环境错误判断失效、冗余样板代码、二进制转换繁琐等长期问题。这些细微却关键的语法与 API 升级,精简了业务代码、降低了隐性 BUG 概率,让 JavaScript 开发更规范、高效、稳定,贴合实际开发需求。
以上关于ES2026 第 17 版新增的 5 个新特性的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » ES2026 第 17 版新增的 5 个新特性
微信
支付宝