2013-07-21 17 views
26

Perché in node.js è {} == {} equivalente a false, ma è {} + {} == {} + {} equivalente a true?Perché {} == {} è falso, ma {} + {} == {} + {} è vero

> {} == {} 
false 
> {} + {} == {} + {} 
true 
+17

correlate:. [WAT?] (Http://destroyallsoftware.com/talks/wat) –

+2

In Chrome è falso, solo per interesse. –

+1

@RichBradshaw non ha eseguito test con Chrome, solo con nodo. – 0xAX

risposta

53

+ qui è l'operatore di stringa di concatenazione. Questo:

{} == {} 

significa "se creo un oggetto con {}, e un altro oggetto con {}, sono essi lo stesso oggetto?"; e la risposta è "no".

Questo:

{} + {} == {} + {} 

mezzi "è la stringa primitiva "[object Object][object Object]" lo stesso come la stringa primitiva "[object Object][object Object]"?"; E la risposta è si".


A cura di aggiungere: Un certo numero di commentatori sottolineano che in console Web di Chrome, {} + {} esegue inoltre numerico, NaN + NaN, in modo tale che {} + {} == {} + {} in realtà restituisce false (perché non è vero che NaN == NaN). La console Web di Firefox fornisce lo stesso risultato di Chrome, ma se la si esegue all'interno di una pagina, fornisce lo stesso risultato di node.js.

[Redacted: lunga spiegazione di come le specifiche impone che {} + {}dovrebbe essere concatenazione di stringhe e {} + {} == {} + {}dovrebbe essere vero; la spiegazione, mentre corretto, non è più terribilmente interessante, dato il seguito]


A cura di aggiungere:. Grazie ad un commento di jJ', ora in grado di offrire una migliore spiegazione della incoerenza.

Il motivo del comportamento della console Web è che la console Web non richiede specificamente un'espressione; accetterà felicemente qualcosa come if(true) { }. Quindi, quando vede {} + {}, non lo interpreta come un'espressione; l'iniziale {} viene interpretato come un blocco nudo, quindi lo + {} viene interpretato come un'espressione (creando un nuovo oggetto, convertendolo in un numero primitivo — ovvero NaN — e valutando tale numero). La console Web visualizza il risultato dell'ultima espressione (ad esempio, l'input 3; 4 darà l'output 4), che in questo caso è NaN.

{} + {} == {} + {}, analogamente, è interpretato come "blocco vuoto, seguito da (+{}) == ({} + {})", cioè "blocco vuoto, seguito da NaN == '[object Object][object Object]'", cioè "blocco vuoto, seguito da false".

Questo può essere risolto utilizzando le parentesi; ({} + {} == {} + {}), ad esempio, restituisce true.

(Questo comportamento, a proposito, non è completamente specifico per la console Web.eval segue le stesse regole, in modo tale che eval('{} + {}') è NaN e eval('({} + {})') è '[object Object][object Object]')

+0

Sì, ho visto "[oggetto oggetto] [oggetto oggetto]" risultato da {} + {}, sono nuovo in node.js e non ho prestato attenzione a è solo una stringa, ho pensato che fosse il tipo di dati interno del nodo :), ora vedo che 'typeof ({} + {})' è 'stringa'. Grazie per la grande risposta e spiegazione – 0xAX

+0

@ruakh: Ottima spiegazione! Qualche idea sul perché '{} + {} == {} + {}' restituisce 'false' in chrome e firefox? –

+2

@ go-oleg Perché in FF '{} + {}' è 'NaN'. E 'NaN == NaN' è falso, perché ** NaN non è mai uguale a se stesso **. Vedi questa spiegazione: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FNaN – BlackSheep

Problemi correlati