For AI agents: the complete documentation index is available at /tc39-atlas/llms.txt, the full documentation bundle is available at /tc39-atlas/llms-full.txt, and this page is available as Markdown at /tc39-atlas/proposals/year/pending/proposal-json-parseimmutable.md.
  • 简体中文
  • JSON.parse options S2.7

    中文标题:JSON.parse 选项提案

    提案概览
    提案速览

    该提案旨在满足 ECMAScript 中将 JSON 字符串解析为深度不可变对象的需求。它向 JSON.parse 添加一个选项包参数,其中包含两个布尔属性:freeze 和 nullPrototype,其默认值保持现有行为不变。freeze 选项确保返回对象被深度冻结,而 nullPrototype 控制冻结的普通对象是否具有 null 原型。该设计也为其他预设 reviver 留出可能,但本提案的范围仅限于这两个选项。

    Note

    以下 README 来自上游仓库,其中的阶段或状态标注可能滞后;当前信息以提案概览为准。

    JSON.parse 选项提案

    状态

    第二阶段

    负责人:

    • Nicolò Ribaudo (Igalia)
    • Ashley Claymore (Bloomberg)
    • Peter Klecha (Bloomberg)

    概述

    本提案指出 ECMAScript 需要一种函数,它解析 JSON 字符串,但返回深度不可变对象。目前可以通过 reviver 实现这一点,代价是性能和静态可分析性。该提案当前的状态是向现有 JSON.parse 函数添加一个选项包参数,从而允许使用各种“预设”reviver,包括确保返回对象被深度冻结的 reviver。

    const obj = JSON.parse('{ "one": { "two": 3 } }', { freeze: true });
    assert(Object.isFrozen(obj));
    assert(Object.isFrozen(obj.one));

    如今,可以使用 reviver 来达到类似结果:

    JSON.parse(data, (key, value) => Object.freeze(value));

    但原生实现可能比基于 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 已被撤回,因此需要更改本提案的范围。