sosukesuzuki.dev

2022年 sosukesuzuki 1人アドベントカレンダー

December, 07 2022

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() もよく考えたらほしいな

こういう提案があるのかどうかは筆者は知らないのですが、Responsejson() のイミュータブル版もほしいなと思いました。

でも Response は Fetch Standard に含まれていて、Fetch Standard に WHATWG で管理されているはずなので、そのへんの連携ってどうなってるんだろうか。

参考リンク