抽象等価比較アルゴリズム
2値が等価かをゆるく比較するときに使うアルゴリズム。
……意味不明&奇怪なので和訳した上で解釈したものを載せておきます。
xとyが値である比較(x === y)の評価値はtrueまたはfalseになります。この比較は、以下のように実行されます。
2. x, yにObjectがあれば、プリミティブ値に変換した上で再度(1)から行います。
3. x, yにBooleanがあれば、trueは1、falseは0に変換します。
4. nullとundefinedの組み合わせならtrueを返します。
xとyのいずれかがNaNなら、falseを返します。
xとyの数値が同じなら、trueを返します。
xとyが「+0と-0」、もしくはその逆なら、trueを返します。
上の3つに当てはまらなければ、falseを返します。
xとyがともに同じ数を指すなら、trueを返します。
そうでなければ、falseを返します。
7. BigIntとNumberの組み合わせなら、双方が同じ値をさしていてかつ有限かつ有効な数値であればtrue、そうでなければfalseを返します。
8. ここまでのいずれにも当てはまらなければfalseを返します。
NOTE
(7)で「有限かつ有効な数値」という表現を使いましたが、この翻訳元のfiniteについてECMAScript仕様では以下のように説明されています。(一部省略)
The "Not-a-Number" values of the IEEE Standard are represented in ECMAScript as a single special NaN value.
There are two other special values, called positive Infinity and negative Infinity.
The other values are called the finite numbers.
なのでたぶん「NaNでも正負の無限大でもない数」がfiniteな数なんだと思います。
追記 : NOTE 2
(2)で軽率にプリミティブ値に変換しますって言ってますが、この部分はそのオブジェクトの.valueOf()の返り値を用いるようです
(それがプリミティブじゃなかったら.toString()、それもだめならUncaught TypeError: Cannot convert object to primitive value)
このアルゴリズムを使用する組み込みメソッド
抽象等価比較演算子==