配列の{}ようにオブジェクトを定義するより短い方法が一般的に知られています。[]
しかし今、私はなぜだろうと思っています:
{} != ({})
{}未定義と評価されます({})「正しい」オブジェクトとして評価されます
JavaScript がこのように動作するのはなぜですか?
たとえば、1に等しいのに、 に等しくないのは(1)なぜですか?{}({})
配列の{}ようにオブジェクトを定義するより短い方法が一般的に知られています。[]
しかし今、私はなぜだろうと思っています:
{} != ({})
{}未定義と評価されます({})「正しい」オブジェクトとして評価されますJavaScript がこのように動作するのはなぜですか?
たとえば、1に等しいのに、 に等しくないのは(1)なぜですか?{}({})
{} != ({})
これは構文エラーです。
SyntaxError: 予期しないトークン !=
{}そのように曖昧です。空のブロックですか、それとも空のオブジェクト リテラルですか? 比較演算子がブロックをたどることができないため、失敗しています。
括弧で囲むと、パーサーはそれを式として扱います。式にブロックを含めることはできないため、それがオブジェクトであることを認識します。
ただし、その比較を式でラップすると...
({} != ({}))
...オブジェクトが値に割り当てられている変数はそれらへのポインターであり、その結果、それらの内容によってそれらがコピーされることはないため、それは依然として真実です(ただし、これはあなたの例には関係ありません)。このため、ポインタは常に異なり、比較は失敗します。
これは、同じオブジェクトを指す 2 つの変数の比較が期待どおりに機能することも意味します。それらのポインターは同じになるからです。
{} != {}{}両方が完全に異なるオブジェクトであるため、真です。ただし、同じオブジェクトを参照している変数は同等です。
var a = {},
b = a;
assert( a == b )