Perché in node.js è {} == {}
equivalente a false
, ma è {} + {} == {} + {}
equivalente a true
?Perché {} == {} è falso, ma {} + {} == {} + {} è vero
> {} == {}
false
> {} + {} == {} + {}
true
Perché in node.js è {} == {}
equivalente a false
, ma è {} + {} == {} + {}
equivalente a true
?Perché {} == {} è falso, ma {} + {} == {} + {} è vero
> {} == {}
false
> {} + {} == {} + {}
true
+
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]'
)
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
@ruakh: Ottima spiegazione! Qualche idea sul perché '{} + {} == {} + {}' restituisce 'false' in chrome e firefox? –
@ 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
correlate:. [WAT?] (Http://destroyallsoftware.com/talks/wat) –
In Chrome è falso, solo per interesse. –
@RichBradshaw non ha eseguito test con Chrome, solo con nodo. – 0xAX