Object.is()が厳密等価演算子(===)と比較してより厳密な比較が可能だと最近知ったので、厳密等価演算子とObject.is()の違いについてまとめます。
等価演算子(==)と厳密等価演算子(===)の違い
まずは等価演算子(==)と厳密等価演算子(===)の違いをざっと復習します。
console.log(1 == '1'); // true
console.log(1 === '1'); // false
console.log(null == undefined); // true
console.log(null === undefined); // false
上記のように、==は型が異なっていてもtrueを返却することがあります。
なお、===は比較する型が異なった場合はfalseを返します。
Object.is()とは
Object.is()は2つの引数をとり、引数同士が同一値かを判定します。
Object.is(1, '1') // false
Object.is({ a: 123 }, { a: 123 }) // false
const b = {}
Object.is(b, b); // true
b === b; // true
ちなみにJestのMatcherのtoBe()は、内部でObject.is()を使用しているみたいです。
Object.is()と===の違いは
下記のようなかなり特殊なケースの場合に挙動に違いがあります。
console.log(0 === -0); // true
Object.is(0, -0); // false
console.log(+0 === -0); // true
Object.is(+0, -0); // false
まとめ
厳密等価演算子とObject.is()の違いがかなり特殊なケースだったので、積極的にObject.is()を使っていくほどでは無い気もしますが、コードを読む上で知っておいてよかったです。