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.parseImmutable S2

    中文标题:JSON.parseImmutable 提案

    提案概览
    提案速览

    该提案解决了将 JSON 字符串解析为深度不可变对象的需求。目前,这需要 reviver 函数,从而损害了性能和静态可分析性。该提案为 JSON.parse 添加一个包含 freezenullPrototype 两个布尔选项的选项包,在保持默认行为不变的情况下,原生支持深度冻结对象和 null 原型对象。

    Note

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

    JSON.parse 选项提案

    状态

    阶段 2

    提案负责人:

    • 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 添加一个选项包,其中包含两个布尔属性:freezenullPrototype

    这些选项的默认值为 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 提案已被撤回,因此需要更改本提案的范围。