JSLint]1を使ってJavaScriptを調べているのですが、if
文の中でidSele_UNVEHtype.value.length == 0
を比較するような場合に、==
(2つの等号)を===
(3つの等号)に置き換えるような提案がたくさん出てきます。
パフォーマンス上のメリットはありますか?
多くの比較演算子が存在するため、パフォーマンスの向上は歓迎されます。
型変換が行われない場合、==
に比べてパフォーマンスの向上はありますか?
アイデンティティ(===
)演算子は、型の変換が行われないことを除けば、イコール(===
)演算子と同じ動作をしますが、型が同じでなければ等しいとは言えません。
参考にしてください。Javascriptチュートリアル:比較演算子を参照してください。
===演算子は、必要な型変換を行った後に、_等しいかどうかを比較します。 2つの値が同じ型でない場合、
===は単に
false`を返します。どちらも同じくらい速いです。
Douglas Crockfordの素晴らしいJavaScript: The Good Partsを引用します。
JavaScriptには2組の等号演算子があります。それは
===
と!==
、そしてその邪悪な双子の==
と!=
です。 良い方の演算子は期待通りの働きをします。 2つのオペランドが同じ型で同じ値を持つ場合、===
はtrue
を、!==
はfalse
を生成します。 邪悪な双子は、オペランドが同じ型の場合は正しい動作をしますが、異なる型の場合は、値を強制的に変えようとします。 これらは興味深いケースの一部です。
''== '0' // false 0 == '' // 真 0 == '0' // 真
false == 'false' // false false == '0' // true
false == undefined // false false == null // false null == undefined // true
' ˶ˆ꒳ˆ˵ ' == 0 // true
遷移性がないのが気になります。 私のアドバイスは、決して邪悪な双子を使わないことです。 代わりに、常に
===
と!==
を使ってください。 先ほど示した比較のすべては、===
演算子でfalse
を生成します。
コメントやPhillipe Laybaert氏回答の中で、Casebash氏が参照型に関して良い指摘をしています。 参照型の場合、==
と===
は、(特殊な場合を除いて)互いに一貫して動作します。
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
特殊なケースとは、リテラルと、その toString
や valueOf
メソッドによって同じリテラルとして評価されるオブジェクトを比較する場合です。例えば、文字列リテラルと String
コンストラクタで作成した文字列オブジェクトを比較する場合を考えてみましょう。
"abc" == new String("abc") // true
"abc" === new String("abc") // false
ここでは、==
演算子は2つのオブジェクトの値をチェックしてtrue
を返していますが、===
は2つのオブジェクトが同じ型ではないと判断してfalse
を返しています。 どちらが正しいのでしょうか? それはあなたが何を比較しようとしているかによります。 私のアドバイスとしては、この質問を完全に回避して、文字列オブジェクトを作成するために String
コンストラクタを使用しないようにすることです。
**参考までに http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
演算子 ==
の使用 (Equality)
true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2; //true, because "2" is converted to 2 and then compared
演算子 ===
の使用 (Identity)
true === 1; //false
"2" === 2; //false
これは 不等号演算子 ==
が型強制 を行うためで、つまりインタープリタは比較する前に暗黙のうちに値を変換しようとするのです。
一方、identity 演算子 ===
は型強制を行わないため、比較時に値を変換せず、1ステップ省略されるため、(This JS benchmark test によれば)高速です。