JSON.parseImmutable S2
中文标题:JSON.parseImmutable 提案
- 阶段: Stage 2
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年9月19日
- English original · 官方仓库
该提案解决了将 JSON 字符串解析为深度不可变对象的需求。目前,这需要 reviver 函数,从而损害了性能和静态可分析性。该提案为 JSON.parse 添加一个包含 freeze 和 nullPrototype 两个布尔选项的选项包,在保持默认行为不变的情况下,原生支持深度冻结对象和 null 原型对象。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
JSON.parse 选项提案
状态
阶段 2
提案负责人:
- Nicolò Ribaudo (Igalia)
- Ashley Claymore (Bloomberg)
- Peter Klecha (Bloomberg)
概述
本提案指出了 ECMAScript 中的一个需求:需要一种能够解析 JSON 字符串但返回深度不可变对象的函数。目前可以通过 reviver 来实现,但代价是性能和静态可分析性。本提案当前的状态是向现有的 JSON.parse 函数添加一个选项包参数,允许使用各种“现成的” reviver,其中包括一个可确保返回对象被深度冻结的 reviver。
目前要实现类似的结果,可以使用 reviver:
但原生实现可能比基于 reviver 的实现快得多,并且静态分析将大大受益于这一知识:JSON.parse(..., { freeze: true }) 的结果始终是深度冻结的。
由 JSON.parse(..., { freeze: true }) 返回的冻结普通(非数组)对象默认也会具有 null 原型,但此行为也可以独立于冻结行为进行配置。
因此,总体而言,本提案将向 JSON.parse 添加一个选项包,其中包含两个布尔属性:freeze 和 nullPrototype。
这些选项的默认值为 false,因此除非显式传入这些选项,否则 JSON.parse 的行为保持不变。
本提案还为其他现成的 reviver 打开了大门,例如,将日期字符串转换为 Temporal 对象的 reviver,或将数字字符串转换为 BigInt 值的 reviver。
然而,本提案的范围仅限于上述两个选项。
历史
本提案最初是 Records and Tuples 提案 的一部分,但为了缩小核心 Records and Tuples 提案的范围,它被拆分成了一个单独的提案。#330。此时,该提案是添加一个新的 JSON.parseImmutable 函数,其行为与 JSON.parse 完全一样,但返回 Record 或 Tuple,它们是 Records and Tuples 提案所建议的两种类型。Records and Tuples 提案已被撤回,因此需要更改本提案的范围。