{}
は、[]
のようなオブジェクトを定義する短い方法であることがよく知られています。なぜJavaScriptでは{}!=({})ですか?
しかし、今、私はなぜ疑問に思って:JavaScriptがこのように動作しているのはなぜ
{} != ({})
{}
は未定義({})
に評価が "正しい" オブジェクト
に評価しますか?
たとえば、1
は(1)
に等しいので、なぜ{}
は({})
に等しくないのですか?
{}
は、[]
のようなオブジェクトを定義する短い方法であることがよく知られています。なぜJavaScriptでは{}!=({})ですか?
しかし、今、私はなぜ疑問に思って:JavaScriptがこのように動作しているのはなぜ
{} != ({})
{}
は未定義({})
に評価が "正しい" オブジェクトに評価しますか?
たとえば、1
は(1)
に等しいので、なぜ{}
は({})
に等しくないのですか?
{} != ({})
これは構文エラーです。
SyntaxError: Unexpected token !=
{}
のように曖昧です。それは空のブロックか空のオブジェクトリテラルですか?比較演算子がブロックをたどることができないため、失敗しています。
括弧で囲むと、パーサーはこれを式として扱います。式はブロックを含むことができないので、それがオブジェクトであることがわかります。
あなたは...
({} != ({}))
を式にその比較を包む場合は、それらの値に割り当てられたオブジェクトを持っている変数は、それらへのポインタあるとしてしかし、...それはまだ本当です結局のところ、それらはコンテンツによってまったくコピーされません(ただしこれはあなたの例には関係ありません)。このため、ポインタは常に異なり、比較は失敗します。
これはまた、同じオブジェクトを指す2つの変数を比較すると、ポインタが同じになるため、期待通りに機能することを意味します。
ここで何をするか教えてください/ /インスタンスメソッド*/ \t hasOwn =({})。hasOwnProperty、 '[jQueryソース](http://code.jquery.com) /jquery-1.11.0.js)? (Y) – loveNoHate
@ dollarVarそれはそれ自身の質問かもしれません。同じことですが、作者は 'Object.prototype 'への参照が必要です。hasOwnProperty'が、オブジェクトリテラルを介してアクセスしています。私の答えに記載されているあいまいさのために、それは括弧で囲まなければなりません。さもなければ、それはブロックとして解析され、ブロックに対するプロパティ参照はありません:) – alex
'{}!=({})'は構文エラーです。 –
'1'と' {} 'は全く異なる獣です。 –
同様の理由で配列にも同じことが当てはまります(配列もオブジェクトなので): '[]!= []'は真です。 – Stuart