JavaScript

Object.is()で厳密等価演算子(===)よりも厳密な比較をする

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()を使っていくほどでは無い気もしますが、コードを読む上で知っておいてよかったです。