比較演算子の落とし穴

JavaScriptの比較演算子(==)は推移的ではありません。 数学から翻訳すると、これはa == bおよびa == cであるという事実から、 b == cの後に 続かないことを意味します



簡単な例:



var a = "";

var b = new String(a);

var c = new String(a);



alert(a==b); // true

alert(a==c); // true

alert(b==c); // false








問題は何ですか? しかし、実際には、変数bcはオブジェクトであり(それらは異なります)、 aはプリミティブ値(文字列リテラル)です。 2つのオブジェクト変数は、異なるオブジェクトを参照する場合、等しくないと見なされます。 プリミティブ値とオブジェクトを比較するとき、他のルールが使用されます-すべてが文字列に縮小されてから比較されます。



これは何でいっぱいですか? 非常に微妙な間違いがたくさんあります。 プログラマーの観点から見ると、文字列型のプリミティブ値とString()コンストラクターによって文字列から作成されたオブジェクトは事実上区別できません。多くの本でさえ、この瞬間は具体的な例なしで言及されています。



状況は、他のプリミティブ型および対応するオブジェクト(Numberなど)と同様です。



2つの変数を比較するときは注意してください!



All Articles