var x = function() {};
var y = function() {};
alert(x === y); // is false;
両方が同じ値に初期化されている場合、xがyと等しくないのはなぜですか?
var x = function() {};
var y = function() {};
alert(x === y); // is false;
両方が同じ値に初期化されている場合、xがyと等しくないのはなぜですか?
JavaScriptでオブジェクトを比較するときは、それらが同一のオブジェクトであるかどうかではなく、同じオブジェクトであるかどうかを確認しています。
MDNから:
両方のオペランドがオブジェクトの場合、JavaScriptは、オペランドがメモリ内の同じオブジェクトを参照するときに等しい内部参照を比較します。
明らかに、オブジェクトは互いに区別され、異なるメモリ位置を参照します。等しい比較演算子は、両方のオペランドがレプリカであるかどうかではなく、同じオブジェクトを参照しているかどうかをチェックします。
その事実を考慮してください(new Number(1)) != (new Number(1))
、一方1 == 1
それらは同じ関数オブジェクトではないためです。コンパレータは関数本体を見ません。
ECMA標準は、JavaScriptで厳密な同等性がどのように機能するかに関するいくつかの正確なルールを提供します。基本的に、@ Quentinが言ったように、2つのオブジェクト(Number、String、Boolean、null、またはundefined以外)を比較している場合、それらが同じオブジェクトである場合にのみtrueを返します。ここではそうではありません。
このコードを考えてみましょう:
var x = function() {};
var y = function() {};
x.something = "this is x";
y.something = "this is not x";
alert(x.something === y.something);
これは与えるでしょうfalse
。
仕様-11.9.6から:
厳密な等式比較アルゴリズム
x === y(xとyは値)の比較では、trueまたはfalseが生成されます。このような比較は次のように実行されます。
1. Type(x)がType(y)と異なる場合は、falseを返します。
2. Type(x)がUndefinedの場合、trueを返します。
3. Type(x)がNullの場合、trueを返します。
..。
7. xとyが同じオブジェクトを参照している場合は、trueを返します。それ以外の場合は、falseを返します。