JavaScriptの比較演算子の挙動
改めて調べてみた所、面白い動きをするようなので、個人的なまとめ。
以下は、chrome の javaScriptコンソールでの確認
== は型を無視
1 2 3 4 5 6 7 8 |
1 == "1" >true 1 === "1" >false 1 != "1" >false 1 !== "1" > true |
配列の比較は参照元の比較
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var a = [1, 1] var b = [1, 1] a == b >false a === b >false b = a a == b >true a === b >true |
配列リレラルを直接==で比較すると必ずfalse(参照元の比較になるため)
1 2 |
[1, 1] == [1, 1] >false |
大なり(<)小なり(>)などで比較すると内容の比較になる
1 2 3 4 5 6 |
[1,1] >= [1, 1] >true [1,1] < [1, 2] >true [1,1] > [1, 2] false |
配列内にオブジェクトが含まれていても比較できるっぽい。
1 2 3 4 5 6 7 8 |
[{},1] <= [{},2] >true [{},3] <= [{},2] >false [1,function(){}] <= [2,function(){}] >true [1,function(){}] >= [2,function(){}] >false |
オブジェクトリテラルは直接比較できない
1 2 |
{a:1} == {a:1} >SyntaxError |
変数に入れた場合は比較可能(参照元比較)
1 2 3 4 |
var a = {a:1} var b = {a:1} a == b >false |
配列の比較が参照元比較になるため、YUI testなどでは以下のテストは失敗する。
1 |
Assert.areEqual(["String", 1, 32], ["String", 1, 32]); //FAILになる |
YUIのAssert.areEqual – jsdo.it – share JavaScript, HTML5 and CSS
関数やメソッドの戻り値が、配列やオブジェクトの場合areEqualのテストでハマりやすいので注意。