Record & Tuples から派生した JSON.parseImmutable というプロポーザルがよさそう
2022年の sosukesuzuki 1人アドベントカレンダー 7 日目です。
Records & Tuples というそこそこ有名(?)なプロポーザルがありますが、そのプロポーザルから派生した JSON.parseImmutable
という新しいプロポーザルが良さそうなので紹介します。
Records & Tuples
Records & Tuples はレコードとタプルという新しいデータ構造を導入する現在 Stage 2 のプロポーザルです。
レコードとタプルは、それぞれイミュータブルなオブジェクトと配列のようなものです。現在提案されている構文では通常のオブジェクトリテラルや配列リテラルの頭に #
をつけると、レコードとタプルになります。
const record = #{
x: 1,
y: 2,
};
const tuple = #[1, 2, 3];
レコードやタプルやイミュータブルなデータ構造なので後から内容を更新することはできません。
レコードとタプルの大きな特徴は等価性です。オブジェクトと配列は ===
で比較すると参照が同じ場合に限って true
になりますが、レコードとタプルは ===
で比較すると内容が同じ場合に true
になります。
const obj = {
x: 1,
y: 2,
};
console.log(obj === { x: 1, y: 2 }); // false
const record = #{
x: 1,
y: 2,
};
console.log(record === #{ x: 1, y: 2 }); // true
もともとは Const Value Types という名前で 2019 年に提案されていたようです(知らなかった)。
JSON.parseImmutable
JSON.parseImmutable は Records & Tuples から派生した Stage 2 のプロポーザルです。
JSON.parseImmutable
は JSON 文字列をパースした結果をレコードとして返します。名前の通り JSON.parse
のイミュータブル版ということです。
const jsonStr = `{ "x": 1, "y": 2 }`;
const record1 = JSON.parseImmutable(jsonStr);
const record2 = JSON.parseImmutable(JsonStr);
console.log(record1 === record2); // true
これが便利そうなので筆者としてはとても欲しいです。個人の経験としては JSON.parse
の結果がミュータブルなオブジェクトであったことがうれしかったことはほとんどないような気がします。
Records & Tuples は 2019 年からあるプロポーザルですが、JSON.parseImmutable
は 2022 年 7 月の TC39 ミーティングで Records & Tuples の一部として発表され、別の提案として切り出されました。
Response の jsonImmutable() もよく考えたらほしいな
こういう提案があるのかどうかは筆者は知らないのですが、Response
の json()
のイミュータブル版もほしいなと思いました。
でも Response
は Fetch Standard に含まれていて、Fetch Standard に WHATWG で管理されているはずなので、そのへんの連携ってどうなってるんだろうか。