🎄

ENCA 16日目: Intl API に渡す引数の挙動をコア API に合わせる(リジェクト)

2024/12/16に公開

ECMA-402 Intl API について

JavaScript コアの言語仕様は ECMA-262 に定義されています。そしてその拡張仕様である Intl API が ECMA-402 で定義されています。国や言語、文化によって異なる処理をサポートします。

// 通貨のフォーマット
const formatter = new Intl.NumberFormat("ja-JP", {
  style: "currency",
  currency: "JPY",
});
console.log(formatter.format(12345)); // "¥12,345"

詳しくは Saji さんの 1人 Intl Advent Calendar 2024 1 日目の記事が参考になると思います。

https://zenn.dev/sajikix/articles/intl-advent-calendar-24-01

Intl API に渡す引数の挙動をコア API に合わせる(リジェクト)

ECMA-262 と ECMA-402 が仕様として分かれていることにより、意図せず API の挙動が異なっていたことが発見されました。整数値を受け取る際に ECMA-262 では先に小数点以下を切り捨てたあとに範囲チェックするのに対し、ECMA-402 では先に範囲チェックするようになっていました。

// ECMA-262: -0.5 の小数点以下を切り捨て 0 にしたあとで範囲チェックする
(123.45).toFixed(-0.5); // "123"

// ECMA-402: -0.5 は整数値ではないので RangeError を投げる
new Intl.NumberFormat("ja-JP", {
  maximumFractionDigits: -0.5,
}).format(123.45);

2024年7月にこの問題について議論されましたが、一貫性よりも先にバリデートする方が価値があること、実装を変更する労力に見合わないことからリジェクトされました。

https://github.com/tc39/ecma402/pull/908

Discussion