JSON.parse options S2.7
中文标题:JSON.parse 选项提案
- 阶段: Stage 2.7
- 状态: 进行中
- ECMAScript 版本: —
- 同步时间: 2026年10月11日
- English original · 官方仓库
该提案旨在满足 ECMAScript 中将 JSON 字符串解析为深度不可变对象的需求。它向 JSON.parse 添加一个选项包参数,其中包含两个布尔属性:freeze 和 nullPrototype,其默认值保持现有行为不变。freeze 选项确保返回对象被深度冻结,而 nullPrototype 控制冻结的普通对象是否具有 null 原型。该设计也为其他预设 reviver 留出可能,但本提案的范围仅限于这两个选项。
以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。
JSON.parse 选项提案
状态
第二阶段
负责人:
- 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 Proposal 的一部分,但后来拆分成了单独的提案,以缩小核心 Records and Tuples 提案的范围。#330。此时,该提案原本是要添加一个新的 JSON.parseImmutable 函数,其行为与 JSON.parse 完全一样,但返回 Record 或 Tuple,也就是 Records and Tuples Proposal 所提出的两种类型。Records and Tuples Proposal 已被撤回,因此需要更改本提案的范围。