2013-08-29 10 views

risposta

15

Nella console del browser, quando non è preceduta da un = (o qualche altro codice che cambia il suo contesto), {} viene considerato come blocco, non un oggetto letterale.

Poiché il blocco è vuoto, non fa nulla, lasciando + [].

L'operatore unario più converte l'array in un numero, che è 0.

+1

In effetti, prova '({} + []) '. Non sapevo che avrei potuto usare '{}' senza 'if/else/do/while/function/etc'. – biziclop

1

Quando si utilizza un operatore contro gli oggetti, l'interprete javascript deve trasmettere i valori alla primitiva utilizzando il metodo valueOf che in effetti utilizza la funzione ToPrimitive interna che inoltra il tipo di trasmissione al metodo interno [[DefaultValue]] dell'oggetto.

L'esempio con l'operatore più è un po 'complicato perché l'operatore può agire sia come aggiunta matematica che come concatenazione di stringhe. In questo caso concatena le rappresentazioni di stringa degli oggetti.

cosa sta realmente accadendo dietro le quinte è:

a = {}.valueOf().toString() + [].valueOf().toString(); 

Dal momento che la matrice è vuota il metodo toString restituisce una stringa vuota, è per questo che il risultato corretto dovrebbe essere [object Object], che è il valore restituito da Object.valueOf() toString().

Problemi correlati