5

は就職の面接の前にはJavaScriptオンライン・テストでの質問のいずれかになります。オブジェクト 'a == b`を真とする方法を比較するには?ここ

function F(){}; 

var a = new F(); 
var b = new F(); 

Q:比較a == btrueするようにする方法は? (例えばconsole.log(a == b) // true

IはabFの2つの異なるインスタンスであり、非プリミティブの場合JSに等しい比較基準とを比較するので、それは不可能だと答えました。

しかし、しばらく前にAxel Rauschmayerの記事「JavaScriptでの偽の演算子のオーバーロード」:http://www.2ality.com/2011/12/fake-operator-overloading.htmlを読みました。オブジェクトの比較で演算子のオーバーロードを偽装するためのハックがあるのでしょうか?

+4

'JSON.stringifyは、(A)== JSON.stringify(b)は' –

+0

が実際、@roastedないから新しいを除去することによって。あなたが答えたトピックでは、正しい方法でオブジェクトの比較を行う方法についてです。ここに別のケースがあります。 – jsguff

+0

@jsguff申し訳ありません、ただタイトルを読んで私は急いで結論に達しました –

答えて

5

実際には、「a == bを比較する方法」という意味に依存します。

あなたがコンストラクタを変更することが許可されている場合、あなたはシングルトンあなたのコンストラクタを作ることができます:彼らはそれはしかし、あなたは可能性が、その後a == bが含まれている比較ですがありますされて、あなたはすべてを維持したい場合は

function F(){ 
    if (!F.instance) { 
     F.instance = this; 
    } else { 
     return F.instance; 
    } 
}; 
var a = new F(); 
var b = new F(); 
if (a === b) { 
    //they are the same 
} 

次のように記述:

if ("" + a == b) { 
} 

彼らは2つのオブジェクトが同じコンストラクタ関数のインスタンスであるかどうかを確認する方法を知りたい場合は、あなたがconstructorプロパティまたは比較することができ__proto__プロパティ:彼らはこれらの2つのオブジェクトが同じ性質を持っているかどうかdermineの方法をお知りになりたい場合は

if (a.constructor === b.constructor) { 
} 

if (a.__proto__ === b.__proto__) { 
} 

、あなたは自分のJSON文字列を比較することができ、次のいずれか

if (JSON.stringify(a) === JSON.stringify(b)) { 
} 

またはあなたが再帰的に比較する関数を書きます両方のオブジェクトのすべてのプロパティ(深い比較)。

そして質問「比較== bが真であるようにする方法は?」への最も簡単な答え:

var a = new F(); 
var b = new F(); 

b = a; 

if (a === b) { 
    //surprise!!! 
} 
+0

' a === b'はfalseを返します!他の人はうまく動作しています – CME64

+0

@ CME64は私のためにうまくいきます:http://jsfiddle.net/hL3fA/ – basilikum

+0

奇妙なことは何ですか?これをチェックしてください:http://jsbin.com/okinob/3/edit – CME64

0

あなたは異なる機能を比較することができますので、私の最高の答えは、このようになります:

console.log(a.constructor+"" === b.constructor+""); 

文字列として関数を返し、それを文字どおり比較します。

例試験:ノート

function f1(){} 
function f2(){} 
var a = new f1(), 
    b= new f2(); 
console.log(a.constructor+"" === b.constructor+""); 
b = new f1(); 
console.log(a.constructor+"" === b.constructor+""); 

DEMO

===記号を第3のように必要とされないが、タイプ比較のためであろうとの両方が、その時点で文字列であるので==を使用して正確に行うことになります同じもの

編集:私の実際の質問に対する回答ことULD:初期

+0

文字通り** 'console.log(a == b)// => true'が必要です。その場合、 '.__ proto__'や' .constructor'、 'JSON.stringify(any)' – jsguff

+0

@jsguffではなく、 'a = a.constructor +" "を追加する必要がありますか? b = .. 'の前に' console.log(a == b); '条件を文字通り保つ? – CME64

+0

ハァッ、どうして 'a = 42; b = 42? :)私は彼ら(テストの作者)は、文字通り等しい比較を 'a == b'を' true'にする唯一の方法であるため、 'singleton'パターンを正確に意味すると思います。 – jsguff

関連する問題