2012-01-02 8 views
1

javascriptでは、なぜ{}!== Object()ですか?

var o = {}; 
    var p = new Object(); 

    p === o; //false 

    o.__proto__===p.__proto__ // true 

なぜこれが偽の

を考えると?

私は偽を返す理由を教えてくださいね??

+1

[Javascriptでは、\ [1、2 \] == \ [1,2:]または({a:1})==({a:1})の間違いはなぜですか?] ://stackoverflow.com/questions/7713794/in-javascript-why-is-1-2-1-2-or-a-1-a-1-false) –

+0

"ポインタを理解することはスキルではありません。適性"。 "p"と "o"は異なるポインタであり、どちらも同じものです。 – georg

+0

'p'と' o'が異なるポインタであっても、 '==='は依然として真です。重要なことは、2つのポインタが同じオブジェクトを指しているかどうかです。 –

答えて

5

オブジェクトis defined asため===

11.9.6比較xyが値であるx === y、厳密な等価比較アルゴリズム

は、true 又はfalseを生成します。以下のような比較が行われます。同じオブジェクトを参照truex場合とy

...

7.戻ります。それ以外の場合は、 falseを返します。

この場合、どちらも空のオブジェクトですが、これらは別々に作成されるため、同じオブジェクトを参照しません。

補足として、どちらの構成も同じことを行います。 {}を使用するのが一般的な方法です。

+0

なぜ 'o .__ proto __ === p .__ proto__' // true – Terry

+1

@caizZZz:彼らはObject.prototypeから継承しているので(そのうちの1つしかありません) – pimvdb

6

2つのオブジェクトが同じこと(すなわち、何も)が含まれていますが、彼らは同じオブジェクトではありません。

JavaScriptのオブジェクト平等テストでは、2つのパラメータがと全く同じオブジェクトを参照する必要があります。

+1

全く同じオブジェクトは何ですか? – Terry

+2

@caizZZz: 'var o = {}; var p = o; '' p''と 'o'は同じオブジェクトを参照します。 'p'のプロパティを変更すると、' o'も同じインスタンスを指しているので、 'o'も同様に変更されます。 –

+0

しかしなぜ '' o .__ proto __ === p .__ proto__' // true – Terry

1

オブジェクトを作成するたびに、結果には独自の識別情報が割り当てられます。彼らはどちらも「空」であるにもかかわらず、彼らは同じことではありません。したがって、===の比較結果はfalseとなります。 ===を使用して

1

、結果は2つの項目を比較したいとあなたが同じタイプであれば、両方の側の項目は、「同じインスタンス」

であれば、あなたが使用する必要があります表示されます:

var o1 = {}; 
var o2 = new Object(); 

alert(typeof(o1) === typeof(o2)); 

と2つのオブジェクトが同等(プロパティと値)であると見なす場合は、underscore.jsライブラリを試して、isEqual関数を使用する必要があります。

0

この宿題はありますか?その場合

、私はあなたにいくつかのヒントを与える: - 最初の2行は何をすべきか考えてみてください。 oとpは、その2つの行の後に同じオブジェクトを参照していますか? - 正確に何が起きているかを調べる。 2つのオブジェクトを比較して、構造が同じかどうかを確認しますか?あるいは、そのアイデンティティーに基づいてオブジェクトを比較しますか? 2つの式が同じオブジェクトを参照(そのため、通常の等号演算子はない)かどうかをオブジェクト試験用

3

JavaScriptの厳密な比較。

オブジェクトリテラル{}を使用して最初のオブジェクトを作成すると、プロパティのない新しいオブジェクトが作成されます。

Objectコンストラクタを関数として呼び出すことによって、2番目のオブジェクトを作成します。 ECMAScript Language Specificationのセクション15.2.1.1によれば、これはちょうどnew Object()が使用されたかのように新しいオブジェクトを作成します。

poに参照を格納し、poが同じオブジェクトを参照しているかどうかを確認します。彼らはしません。

0

オブジェクトプリミティブ値を含むそれぞれが特性オブジェクト、または機能の順不同の集合です。したがって、各オブジェクトにはプロパティとプロトタイプがあり、それを比較する意味はありません。

関連する問題