Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【JavaScript】JavaScriptにおける等価性比較

等価性比較

ある値やオブジェクトを比較する時、各々が何を持って等しいとするかは使用する言語体系や比較演算子、関数、メソッドによって変わります。JavaScriptでも比較のための演算子として=====が用意され、またECMS2015では比較用のObjectプロパティObject.isが追加されました。これらの等価性比較の手段は、厳密には異なる動作を示します。

==演算子

==演算子による等価性比較では、各オブジェクトを共通の型に変換した上で比較を行います。

console.log(1 == 1); // true

console.log(1 == '1'); //true
console.log(1 == '-1'); //false

console.log(1 == true); //true
console.log(1 == false); //false

console.log(null == undefined) // true

console.log(NaN == NaN); // false

console.log(Number.isNaN(NaN)); // true

上記の例では、左辺のnumber型変数に対して右辺の値がnumber型に変換され、その上で比較が行われています。このように、==演算子では型の互換を許可したゆるい等価性比較が行われます。なおこの比較ではnullundefinedは等価なものとして扱われます。また、NaNはどの値に対しても等価とはなりません(NaNは他のいかなる数値とも等しくないという特性を持ちます)。NaNであるかどうかの比較にはNumber.isNaNを用います。

オペランドの型別変換対応表

f:id:rennnosukesann:20180401221011p:plain MDNより引用)

===演算子

===による比較はより厳格であり、型の暗黙的変換が行われません。すなわち、各オペランドの型が異なる時点で比較式はfalseを返します。当然、型が同じ場合でも値が異なればfalseを返します。なお、こちらの演算子でもNaN同士の比較ではfalseになります。

console.log(1 === 1); // true

console.log(1 === '1'); //false
console.log(1 === '-1'); //false

console.log(1 === true); //false
console.log(1 === false); //false

console.log(null === undefined); //false

console.log(NaN === NaN); // false

Object.is

Object.is===と同じく型変換を行わない厳密な等価比較を行いますが、以下の挙動が===とは異なっています。

  • -0と+0を区別し、両者を等しくないものとする。
  • NaN同士の比較をtrueとする。
console.log(Object.is(0, 0)); // true
console.log(Object.is(0, '0')); // false
console.log(Object.is(0, false)); // false
console.log(Object.is(0, null)); // false
console.log(Object.is(0, undefined)); //false

console.log(Object.is(0, +0)); //true
console.log(Object.is(0, -0)); // false
console.log(Object.is(NaN, NaN)); //true

Object.isを使うことで、通常の== ===演算とは異なるルールを導入してしまうので、特別なことがなければ===を使用したほうが無難です。