13 02 2011 javascript Tweet
昨日の読書会で、等値演算子(==)と同値演算子(===)をきちんと理解していないことが判明したので、サイ本を読んでみた。
Javascriptは、数値、文字列、論理値が等しいかどうかを「値により」判定します 一方オブジェクトや配列、関数の場合には「参照により」判定します
オブジェクト、配列、関数の場合には参照により判断されるので
$ ./shell V8 version 3.0.6.1 > [1,2,3] == [1,2,3] false > [1,2,3] === [1,2,3] false > var a = b = [1,2,3] > a == b true > a === b true
同値演算子は型変換を行わないで値が等しいかどうかを評価するが、等値演算子は2つのオペランドの型が異なる場合には型変換を行う。
同値は演算子は直感に対して素直なのでいいとして、等値は型が異なる場合に次のルールーで型変換をする
- どちらか一方が数値で他方が文字列の場合、文字列を数値に変換してから比較
- どちらか一方がtrueの場合trueを1に、falseの場合には0に変換してから比較
- オブジェクトと数値の比較の場合オブジェクトを基本形に変換してから比較
改めてJGPのB1(p.127)を見てみる。
> '' == '0' false > '' == 0 true > 0 == '0' true
最初の例は文字列の比較なのでfalse。二番目は文字列と数字の比較で型変換されて''はfalseなので数値に変換されると0になるのでtrue。最後は文字列'0'が数値0に変換されて比較されるのでtrueか。