【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型に変換され、その上で比較が行われています。このように、==
演算子では型の互換を許可したゆるい等価性比較が行われます。なおこの比較ではnull
とundefined
は等価なものとして扱われます。また、NaN
はどの値に対しても等価とはなりません(NaNは他のいかなる数値とも等しくないという特性を持ちます)。NaNであるかどうかの比較にはNumber.isNaN
を用います。
オペランドの型別変換対応表
(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
を使うことで、通常の==
===
演算とは異なるルールを導入してしまうので、特別なことがなければ===
を使用したほうが無難です。