JavaScriptでの比較で、等号演算子(== vs ===)のどっちを使うべき? [Javascript]

このエントリーをはてなブックマークに追加

質問:

JSLintを使ってて、if文の中でidSele_UNVEHtype.value.length == 0を比較する時とか、==(2つの等号)を===(3つの等号)で置き換えろ、ってサジェストが出るんだけど、=====に置き換えるとパフォーマンス上のメリットとかってある?

比較演算子をいっぱい使ってるので、パフォーマンスの改善は歓迎なんだけど。。。

型変換が行われない場合は、==を置き換えるメリットってある?

By bcasp | 質問日時: 2008年12月11日 14:19



回答1:

型変換が行われていないことを除けば、同一性(===)演算子は、等価(==)と同じように動作するよ。等しいとみなされるためには型は同じでなければだめ。

リファレンス:Javascriptチュートリアル:比較オペレータ

==演算子は、必要な型を実行した後、等価性を比較する。===' 演算子はその変換をしないので、2つの値が同じ型じゃない時、===は単にfalse`を返す。どちらもおんなじぐらい速いかな。

ダグラス・クロフォードの優れた本JavaScript:The Good Partsを引用すると、

JavaScriptには、2種類の等価演算子、===!==、そして出来の悪い双子 ==!=がある。良い子の方は、君が期待する方法で動作するだろう。もし2つのオペランドが同じ型で同じ値を持つなら、===trueを返し、!==falseを返す。邪悪な双子の方はオペランドの型が同じなら同じように働くけど、型が異なる場合は値を強制しようとする。このルールはは複雑で覚えてなんかいられない。下は一例:

> '' == '0' // false
> 0 == '' // true
> 0 == '0' // true
>
> false == 'false' // false
> false == '0' // true
>
> false == undefined // false
> false == null // false
> null == undefined // true
>
> ' \t\r\n ' == 0 // true
>

>

推移性の欠如は気をつけるべき。僕のアドバイスは悪い双子をを使わないことだ。代わりに、常に===!==を使用すること。===演算子では上でのすべての比較にfalseを返すから。


###更新:

参照までに、(特別な場合を除き)型=====はお互い一貫して同じように動作するよ。
別のもの。

var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true

特殊なケースは、リテラルを評価するオブジェクトと比較する場合。toStringvalueOfメソッドのために同じリテラルに変換する。例えば、文字列リテラルと、Stringコンストラクタによって作られた文字列オブジェクトの比較を見てみよう:

"abc" == new String("abc") // true
"abc" === new String("abc") // false

ここで、 ==演算子は2つのオブジェクトの値をチェックし、trueだけど、===はそれらが同じ型ではないのでfalse。どちらが正しいか?それは君が比較しようとしているものに依存するね。僕のアドバイスは、そんな質問は忘れて、文字列オブジェクトを作るためにStringコンストラクタを使わないこと。

参照
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

By Bill the Lizard | 回答日時: 2008年12月11日 14:25



回答2:

==演算子(Equality)を使うと、

true == 1; // true、 'true'は1に変換されて比較される
"2" == 2; // true、 "2"が2に変換されて比較されるため

===演算子(Identity)を使用すると、

true === 1; //false
"2" === 2; //false

これは、等価演算子==は型強制を行うため。つまり、インタプリタは暗黙的に比較する前に値を変換しようとする。

一方、アイデンティティ演算子 ===は型強制をしない、だから比較の際には値を変換しないよ。



Source: Which equals operator (== vs ===) should be used in JavaScript comparisons?

共有 コメント