🎄

ENCA 9日目: プロパティ列挙順で始めに列挙する整数値の範囲修正

2024/12/09に公開

整数値インデックスの扱い

ECMAScript の数値 number は倍精度浮動小数点数(binary64)です。仮数部が 52 ビットであることから、2^{53} - 1Number.MAX_SAFE_INTEGER)までの整数値を正確に扱うことが出来ます。また配列 Array の長さの最大値は 2^{32} - 1 と定義されており、インデックスとしては +0 から 2^{32} - 2 までの整数値を取ります。

以上の理由から +0 から 2^{53} - 1 までの整数値を integer index+0 から 2^{32} - 2 までの整数値を array index と定義し、区別しています。

プロパティ列挙順で始めに列挙する整数値の範囲修正

昨日の記事で普通のオブジェクトは OrdinaryOwnPropertyKeys で定義された順に列挙され、以下のような順番になると説明しました。

  1. 配列のインデックスとなりうる整数(文字列)プロパティ(array index)をその数の順番で列挙する
  2. 1 以外の文字列プロパティを作成順に列挙する
  3. Symbol プロパティを作成順に列挙する

実は仕様でこの 1 つ目の処理がもともと array index ではなく integer index となっていました。しかしどの JavaScript エンジンで試しても 2^{32} - 1 以上の整数(文字列)は 2 つ目の処理に回されており、仕様が実態(Web Reality)と合っていませんでした。というわけで実態に仕様を合わせようという話が承認され、array index に改められました。

https://github.com/tc39/ecma262/pull/1242

Discussion