2013-01-02 5 views
15

È noto che {} è un modo più breve per definire un oggetto come [] per un array.Perché {}! = ({}) In JavaScript?

Ma ora mi chiedo il perché:

{} != ({}) 
  • {} viene valutata su undefined
  • ({}) viene valutato come oggetto "correggere"

Perché si sta comportando Javascript come questo?

Ad esempio 1 equivale a (1), quindi perché {} non è uguale a ({})?

+7

'{}! = ({})' È un errore di sintassi. –

+0

'1' e' {} 'sono animali abbastanza diversi. –

+0

Ad ogni modo lo stesso vale per gli array per ragioni simili (perché anche gli array sono oggetti): '[]! = []' È vero. – Stuart

risposta

22
{} != ({}) 

Questo è un errore di sintassi.

SyntaxError: Unexpected token !=

{} è ambigua come quella. È un blocco vuoto o un oggetto letterale vuoto? Sta fallendo perché un operatore di confronto non può seguire un blocco.

Il wrapping con parentesi consente al parser di trattarlo come un'espressione. Un'espressione non può contenere un blocco, quindi sa che è un oggetto.

Tuttavia, se si avvolge che il confronto in un'espressione ...

({} != ({})) 

... è ancora vero perché le variabili che hanno un oggetto assegnato ai valori di loro sono un puntatorea loro e come conseguenza, non vengono mai copiati attorno al loro contenuto (anche se questo è irrilevante per il tuo esempio). Per questo motivo, il loro puntatore è sempre diverso e il confronto fallisce.

Ciò implica anche che il confronto di due variabili che puntano allo stesso oggetto funzionerà come previsto, poiché i loro indicatori saranno gli stessi.

+0

Puoi dirmi cosa fa qui '/ * Metodi di istanza */ \t hasOwn = ({}). HasOwnProperty,' nella [origine jQuery] (http://code.jquery.com /jquery-1.11.0.js)? (Y) – loveNoHate

+1

@dollarVar Questa potrebbe essere la sua domanda. È la stessa cosa, gli autori vogliono un riferimento a 'Object.prototype.hasOwnProperty', ma ci sta accedendo tramite un oggetto letterale. A causa dell'ambiguità come menzionato nella mia risposta, deve essere racchiusa tra parentesi, altrimenti viene analizzata come un blocco e non ci sono ricerche di proprietà sui blocchi :) – alex

5

{} != {} è vero perché entrambi gli oggetti {} sono completamente diversi. Tuttavia, le variabili che fanno riferimento allo stesso oggetto tengono uguaglianza:

​var a = {}, 
    b = a; 

assert(a == b)​ 
+1

Non dovresti usare '===' in Javascript per verificare i riferimenti? – Kevin

+2

@Kevin: '===' riguarda i tipi. Gli oggetti sono sempre confrontati con i riferimenti – zerkms

Problemi correlati