質問:
JSLintを使ってて、if
文の中でidSele_UNVEHtype.value.length == 0
を比較する時とか、==
(2つの等号)を===
(3つの等号)で置き換えろ、ってサジェストが出るんだけど、==
を===
に置き換えるとパフォーマンス上のメリットとかってある?
比較演算子をいっぱい使ってるので、パフォーマンスの改善は歓迎なんだけど。。。
型変換が行われない場合は、==
を置き換えるメリットってある?
回答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
を返すから。
###更新:
参照までに、(特別な場合を除き)型==
と===
はお互い一貫して同じように動作するよ。
別のもの。
|
特殊なケースは、リテラルを評価するオブジェクトと比較する場合。toString
やvalueOf
メソッドのために同じリテラルに変換する。例えば、文字列リテラルと、String
コンストラクタによって作られた文字列オブジェクトの比較を見てみよう:
|
ここで、 ==
演算子は2つのオブジェクトの値をチェックし、true
だけど、===
はそれらが同じ型ではないのでfalse
。どちらが正しいか?それは君が比較しようとしているものに依存するね。僕のアドバイスは、そんな質問は忘れて、文字列オブジェクトを作るためにString
コンストラクタを使わないこと。
参照
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
回答2:
==
演算子(Equality)を使うと、
|
===
演算子(Identity)を使用すると、
|
これは、等価演算子==
は型強制を行うため。つまり、インタプリタは暗黙的に比較する前に値を変換しようとする。
一方、アイデンティティ演算子 ===
は型強制をしない、だから比較の際には値を変換しないよ。
Source: Which equals operator (== vs ===) should be used in JavaScript comparisons?