写了十年 JavaScript,今天才发现 ECMAScript 2026 把这些细节全改了——第17版规范新特性实战

写了十年 JavaScript,你可能没注意到,就在刚过去的6月30日,ECMA International 正式批准了 ECMAScript 2026,这是 JavaScript 诞生以来的第17版规范更新。

很多人觉得 ECMAScript 规范离自己很远,但每次浏览器里的新方法、新语法,追根溯源都是这里来的。这次2026版本在数学运算、迭代器、数组、错误处理、编码和 JSON 处理六个方向都有实质更新,我挑最值得注意的几个展开说。


1. Math.sumPrecise:终于有人把浮点数求和的账算清楚了

JavaScript 浮点数求和精度丢失这个问题,写过财务计算或者数据统计的同学应该都被坑过。

这次规范新增了 Math.sumPrecise(),专门解决这个问题:

// 以前:精度丢失
const result = 0.1 + 0.2; // 0.30000000000000004

// 现在:精确求和
const precise = Math.sumPrecise([0.1, 0.2, 0.3]); // 0.6

Math.sumPrecise 接收一个数组,对一组不同数量级的数字求和,最大程度降低精度损失。如果你还在用 reduce((a, b) => a + b, 0) 做累加,财务相关的场景可以直接切这个。


2. Iterator.concat:多个迭代器一键合并

以前合并两个迭代器要写个循环或者手动拼接,这次规范直接给了 Iterator.concat

const iter1 = [1, 2, 3].values();
const iter2 = [4, 5, 6].values();
const merged = Iterator.concat(iter1, iter2);
[...merged]; // [1, 2, 3, 4, 5, 6]

支持多个迭代器顺序连接,参数不限个数。对处理数据流、分批加载的场景很实用。


3. Array.fromAsync:等异步可迭代对象终于不用自己包装了

这是我认为最实用的一个更新。以前从异步数据源构建数组,要这样写:

// 以前
async function getItems() {
  const items = [];
  for await (const item of asyncIterator) {
    items.push(item);
  }
  return items;
}

现在一行搞定:

// 现在
const items = await Array.fromAsync(asyncIterator);

Array.fromAsync 可以从异步可迭代对象、ReadableStream、Response 等异步数据源直接构建数组,代码简洁很多。


4. Error.isError:终于能准确识别错误对象了

以前判断一个值是不是 Error 对象,要用 instanceof Error 或者自己写 duck typing,各种边界情况让人头疼。

Error.isError 直接给你一个标准方法:

Error.isError(new Error());        // true
Error.isError({ message: oops }); // false(普通对象不是 Error)
Error.isError(null);               // false

这对写中间件、错误边界、监控告警逻辑的同学来说,代码会干净很多。


5. Map.prototype.getOrInsert:查询不到返回默认值,不需要自己写判断

之前用 Map 要这样处理默认值:

// 以前
const value = map.get(key);
if (value === undefined) {
  map.set(key, defaultValue);
  return defaultValue;
}
return value;

现在:map.getOrInsert(key, defaultValue) 一行搞定,WeakMap 也有同名方法。这个更新不大,但日常高频用到,写起来舒服很多。


6. Uint8Array 进制转换:二进制数据处理少写一堆辅助函数

Uint8Array 新增了和十六进制、Base64 之间的相互转换方法,终于不用再自己写 btoa/atob 或者 hex 转换的辅助函数了:

const bytes = new Uint8Array([72, 101, 108, 108, 111]);
bytes.toHexString();   // "48656c6c6f"
bytes.toBase64String(); // "SGVsbG8="

Uint8Array.fromHexString("48656c6c6f"); // Uint8Array [72, 101, 108, 108, 111]
Uint8Array.fromBase64String("SGVsbG8="); // 同上

做 WebSocket 二进制协议、文件处理、加密相关的同学感受会最深。


7. JSON.parse revivers 新参数:源文本位置终于能拿到了

JSON.parse 的 reviver 函数以前只能拿到解析后的值和路径,现在新增一个参数可以访问原始 JSON 源中的匹配片段,对做调试工具、埋点数据校验的场景很有用。

另外新增了 JSON.rawJSON,支持对 JSON.stringify 输出中的原始值进行精细控制。


这些更新什么时候能用上

规范刚获批,浏览器和 Node.js 实现还需要时间。但从以往经验看,Chrome 和 Firefox 通常在规范获批后的一两个版本内开始落地,部分能力可能已经在最新版浏览器里可用了。

建议先知道这些新方法的存在,等浏览器逐步支持后再切到生产环境。财务计算相关的 Math.sumPreciseArray.fromAsync 值得重点关注,这两个能直接简化很多现有代码。

规范原文在 ECMA-262 里,有兴趣可以翻过去看看每一项更新的设计动机,比想象中更有意思。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 1232 阅读