JavaScriptの==は予想外の結果を返すことがある
JavaScriptの等値演算子==は,左右のオペランドの型が等しい場合,両者の値が等しければtrueに,そうでなければfalseになります.
しかし,2つのオペランドの型が違う場合,==はオペランドを型変換してから比較することがあります.この型変換がなかなか曲者で,比較する値と型の組み合わせによっては予想外の結果が得られることがあります.
以下に例を示します.
'' == '0' // false 0 == '' // true 0 == '0' // true 0 == [] // true 0 == {} // false 0 == false // true 0 == [0] // true 0 == [false] // false false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 // true
上の結果は冗談ではなく本当です.ぜひお使いのブラウザで試してみてください.
もはや何が何だかという感じですよね.しかしこれはECMAScriptの仕様通りの評価結果となっています.このように==の結果が予想外だったせいでバグが発生した場合,デバッグは困難を極めるでしょう.
===はオペランドの型変換を行わない
一方,===はオペランドの型と値が等しい時に限りtrueになります.そのため,上記のような型が違うケースはすべてfalseになります.
'' === '0' // false 0 === '' // false 0 === '0' // false false === 'false' // false false === '0' // false 0 === false // false 0 === [] // false 0 === {} // false 0 === false // false 0 === [0] // false 0 === [false] // false false === undefined // false false === null // false null === undefined // false ' \t\r\n ' === 0 // false
==と比べると直感的でまともな結果が得られることが分かると思います.
自動的に型変換させてまで異なる型の値を比較したいことはそうそうないと思うので,等値演算では普段から===を使う癖をつけたほうがいいでしょう.また,同じ理由から非等値演算では!=よりも!==を使うようにしましょう.
参考資料
「==」はJavaScript: The Good Partsという本の中でも「JavaScriptのBad Parts」のひとつとして紹介されています.
JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
- 作者: Douglas Crockford,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/12/22
- メディア: 大型本
- 購入: 94人 クリック: 1,643回
- この商品を含むブログ (191件) を見る