異なるデータ型の値を比較するには?(==と===の違いを理解する)[JavaScript]:.NET TIPS
JavaScriptで文字列と数値、Booleanと数値、nullとundefinedなど、異なるデータ型の値を比較するには==演算子を使う方法と===演算子を使う方法がある。
JavaScriptで等価比較をする演算子には、==と===の2種類がある(その否定も同様に!=と!==の2種類)。何となく==だけを使ってはいないだろうか? 本稿ではその違いを解説する。
【コラム】.NETとJavaScript
ASP.NETでWebアプリを開発するときに、ブラウザ側で何か処理をするにはJavaScriptで記述することになる。Windowsフォーム/WPFのWebBrowserコントロールやストアアプリ/UWPアプリのWebViewコントロールの内部で処理したければ、やはりJavaScriptだ。また、ストアアプリ/UWPアプリの開発はJavaScriptでもできる。もはや.NETの開発者にとってもJavaScriptは必須だといえるだろう。
厳密等価演算子
===と!==は厳密等価演算子と呼ばれるもので、型の比較も行う。対して、通常の等価演算子(==と!=)は、型が違っている場合には型を合わせてから比較しようとするのだ。
厳密等価演算子は、C#の==とほぼ同じだと覚えておけばよいだろう(後述するようにStringオブジェクトでは動作が異なる)。
数値と文字列
通常の等価演算子は、数値と文字列を比較するとき、文字列を数値に変換することを試みる。厳密等価演算子は、数値と文字列では型が違うので常に等しくないと判定する(次のコード)。
// 通常の等価演算子
5 == "5"; //true
5 != "5"; //false
// 厳密等価演算子
5 === "5"; //false
5 !== "5"; //true
Booleanと数値
通常の等価演算子は、Booleanと数値を比較するとき、Booleanを数値に変換する。trueを1、falseを0として比較を行う*1(次のコード)。
// 通常の等価演算子
true == 1; //true
false == 0; //true
// 厳密等価演算子
true === 1; //false
false === 0; //false
*1 厳密には、falseを+0として比較を行う。JavaScriptの0には、+0と-0がある。通常は気にすることはないが、例えばMath.sign関数では区別される。
nullとundefined
nullとundefinedは、通常の等価演算子では同じもの、厳密等価演算子では違うものとして扱われる(次のコード)。
// 通常の等価演算子
null == undefined; //true
// 厳密等価演算子
null === undefined; //false
文字列とオブジェクト
プリミティブ型(プライマリデータ型)*2とオブジェクトを比較するとき、通常の等価演算子はオブジェクトをプリミティブ型に変換することを試みる。文字列プリミティブとオブジェクトの比較の場合では、オブジェクトを文字列に変換してから比較しようとするのだ。
従って、同じ文字列を持った文字列プリミティブとStringオブジェクトの比較では、通常の等価演算子は等しいと判定する。厳密等価演算子では型が違うので等しくないと判定する(次のコード)。
// 通常の等価演算子
"ABC" == new String("ABC"); //true
// 厳密等価演算子
"ABC" === new String("ABC"); //false
*2 プリミティブ型(プライマリデータ型)には、文字列/数値/Booleanの3種類がある。MSDN「データ型 (JavaScript)」参照。なお、プリミティブの文字列と、Stringオブジェクトは別物である。
オブジェクトとオブジェクト
オブジェクトとオブジェクトの比較では、通常の等価演算子でも厳密等価演算子でも参照の比較となる。C#と違ってStringオブジェクトも例外ではないので、保持している文字列が同じであっても異なるものと判定される(次のコード)。
// 通常の等価演算子
new String("ABC") == new String("ABC"); //false
(new String("ABC")).toString() == (new String("ABC")).toString(); //true
// 厳密等価演算子
new String("ABC") === new String("ABC"); //false
(new String("ABC")).toString() === (new String("ABC")).toString(); //true
Stringオブジェクトでも単純な参照比較になる。
文字列として比較したい場合は、明示的にtoString関数を呼び出して文字列プリミティブの比較にする必要がある。
まとめ
JavaScriptで等価比較をする演算子には、通常の等価演算子と厳密等価演算子の2種類がある。.NET開発者にとっては厳密等価演算子の方が使いやすいだろう。ただし.NET開発者にとって、Stringオブジェクトの比較は要注意だ。
カテゴリ:JavaScript 処理対象:言語構文
関連TIPS:Visual Studioで静的HTMLページのJavaScriptコードをデバッグするには?
Copyright© Digital Advantage Corp. All Rights Reserved.