2013-01-02 8 views
15

{}は、[]のようなオブジェクトを定義する短い方法であることがよく知られています。なぜJavaScriptでは{}!=({})ですか?

しかし、今、私はなぜ疑問に思って:JavaScriptがこのように動作しているのはなぜ

{} != ({}) 
  • {}は未定義
  • ({})に評価が "正しい" オブジェクト

に評価しますか?

たとえば、1(1)に等しいので、なぜ{}({})に等しくないのですか?

+7

'{}!=({})'は構文エラーです。 –

+0

'1'と' {} 'は全く異なる獣です。 –

+0

同様の理由で配列にも同じことが当てはまります(配列もオブジェクトなので): '[]!= []'は真です。 – Stuart

答えて

22
{} != ({}) 

これは構文エラーです。

SyntaxError: Unexpected token !=

{}のように曖昧です。それは空のブロックか空のオブジェクトリテラルですか?比較演算子がブロックをたどることができないため、失敗しています。

括弧で囲むと、パーサーはこれを式として扱います。式はブロックを含むことができないので、それがオブジェクトであることがわかります。

あなたは...

({} != ({})) 

を式にその比較を包む場合は、それらの値に割り当てられたオブジェクトを持っている変数は、それらへのポインタあるとしてしかし、...それはまだ本当です結局のところ、それらはコンテンツによってまったくコピーされません(ただしこれはあなたの例には関係ありません)。このため、ポインタは常に異なり、比較は失敗します。

これはまた、同じオブジェクトを指す2つの変数を比較すると、ポインタが同じになるため、期待通りに機能することを意味します。

+0

ここで何をするか教えてください/ /インスタンスメソッド*/ \t hasOwn =({})。hasOwnProperty、 '[jQueryソース](http://code.jquery.com) /jquery-1.11.0.js)? (Y) – loveNoHate

+1

@ dollarVarそれはそれ自身の質問かもしれません。同じことですが、作者は 'Object.prototype 'への参照が必要です。hasOwnProperty'が、オブジェクトリテラルを介してアクセスしています。私の答えに記載されているあいまいさのために、それは括弧で囲まなければなりません。さもなければ、それはブロックとして解析され、ブロックに対するプロパティ参照はありません:) – alex

5

{} != {}は両方とも{}が完全に異なるオブジェクトであるため真です。しかし、同じオブジェクトを参照している変数は、平等を保持:

​var a = {}, 
    b = a; 

assert(a == b)​ 
+1

Javascriptで '==='を使って参照をチェックしていませんか? – Kevin

+2

@Kevin: '==='は型に関するものです。オブジェクトは常に参照によって比較されます – zerkms

関連する問題