1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?

2022-03-17 06:55:49

質問

を使っています。 JSLint を置き換えるための多くの提案を返しています。 == (2つのイコール記号)を === (3つの等号) を比較するような場合に使用します。 idSele_UNVEHtype.value.length == 0 の中にある if ステートメントを使用します。

を置き換えることで、パフォーマンス上の利点はあるのでしょうか? ===== ?

多くの比較演算子が存在するため、パフォーマンスの向上があれば歓迎します。

型変換が行われない場合は == ?

解決方法は?

厳密な等号演算子( === ) は、抽象的な等号演算子 ( == ) ただし、型変換は行われず、等しいとみなすためには型が同じでなければなりません。

参考にしてください。 ジャバスクリプトのチュートリアル。比較演算子

== 演算子は、同じかどうかを比較します。 必要な型変換を行った後 . また === 演算子は ない は変換を行うので、2つの値が同じ型でない場合は === は単に false . どちらも同じように速いです。

ダグラス・クロックフォード氏の素晴らしい著作を引用します。 JavaScript。良いところ ,

<ブロッククオート

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 と共に === 演算子を使用します。


更新情報

によって、良い指摘がなされました。 ケースバッシュ をコメントで、そして Phillipe Laybaertの 回答 オブジェクトに関するものです。 オブジェクトについて ===== は互いに矛盾なく作用する(特殊な場合を除く)。

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 が、しかし === は、それらが同じ型でないことを見抜き false . どちらが正しいのでしょうか? それは、何を比較しようとしているかによります。 私のアドバイスは、質問を完全に回避して、単に String コンストラクタを使用して、文字列リテラルから文字列オブジェクトを作成します。

参照

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