Jsの等価演算子比較

概要

Javascriptでの等価演算まわりに関して。周りでundefinedの扱いに困っている方が多かったので、undefinedの等価演算子とついでに厳密等価演算子の動作結果を比較してみた。参考になればさいわい。

尚この記事では、typeofには触れていない

比較方法

var i;
if(i)				console.log('i');
if(!i)				console.log('!i');
if(i ==  undefined)	console.log('i ==  undefined');
if(i === undefined)	console.log('i === undefined');
if(i ==  null)		console.log('i ==  null');
if(i === null)		console.log('i === null');
if(i ==  false)		console.log('i ==  false');
if(i === false)		console.log('i === false');
if(i ==  0)			console.log('i ==  0');
if(i === 0)			console.log('i === 0');
if(i ==  "")		console.log('i ==  \"\"');
if(i === "")		console.log('i === \"\"');
if(i ==  "0")		console.log('i ==  \"0\"');
if(i === "0")		console.log('i === \"0\"');

こんな.jsと、読み込ませる.htmlファイルを作り…

150806_blog_js_relation_01
Chromeの “その他のツール” -> “JavasSript コンソール”で出てくる

150806_blog_js_relation_02

chromeのconsole.logで結果を判断。

ローカル変数 var i に色々入れて、どの if() が通るのかという試み。

検証

宣言なし

//var i;

150806_blog_js_relation_03
当たり前ではあるが、エラーがでてしまった!!!!!
iは宣言されてないよ、と。

どうしてもこのヘンを掴みたいならtry()catch{}が無難かなあと。

宣言だけ

var i;

150806_blog_js_relation_04

undefinedを代入

var i=undefined;

150806_blog_js_relation_04
宣言だけと同じ。でも ECMAScript 5 で undefinedを入れちゃダメとかなんとか。
そもそも undefined を代入するとか、よほどの意図が無い限り他の人が見たら混乱してしまう><

null

var i=null;

150806_blog_js_relation_06

true

var i=true;

150806_blog_js_relation_07

false

var i=false;

150806_blog_js_relation_08_false
false==”0″ なのである…

0 (Number)

var i=0;

150806_blog_js_relation_09_0

1 (Number)

var i=1;

150806_blog_js_relation_07

“” (String)

var i="";

150806_blog_js_relation_10_nullstring

“0”

var i="0";

150806_blog_js_relation_11_0_string
if(i) が通り、 if(i == false)  も通る点に注意

“1”

var i="1";

150806_blog_js_relation_07

function

var i=function(){};

150806_blog_js_relation_07

{} (Object)

var i={};

150806_blog_js_relation_07

[] (Array)

var i=[];

150806_blog_js_relation_14_array

ん!? これもif(i) が通り、 if(i == false)  も通る。{} と違う点に注意

[0]

var i=[0];

150806_blog_js_relation_15_array_0

あれ? “0”ではあると

[“0”]

var i=["0"];

150806_blog_js_relation_15_array_0

[0]と同様

[1]

var i=[1];

150806_blog_js_relation_07

[0,0]

var i=[0,0];

150806_blog_js_relation_07

まとめ

  • 検証しててモヤモヤした!
  • 分かっていたことではあるが、厳密でない等価演算子って全体的にクセがある。
    • String周りが思った以上に変?変だなという感じ
    • hashや、URLクエリから、そのまま配列につっこむ際は注意が必要
    • Arrayもワリと変