2016-03-25 15 views
8

Secondo questo documentation,Console.log richiama il metodo toString di un oggetto?

rappresentazioni La stringa di ciascuna di tali scopi vengono aggiunti insieme nell'ordine indicato e uscita.

anche secondo answer

Il + x costringe l'x oggetto in una stringa, che è solo [oggetto Oggetto]:

Quindi, la mia domanda è

Se lo faccio

str = new String("hello") 
console.log(str) //prints the string object but not 'hello' 
console.log(""+str) //prints "hello" 

Quindi, nel primo caso, stampa semplicemente l'oggetto (non richiama il metodo toString()).

Ma nel secondo caso, non costringe ma stampa semplicemente il valore primitivo. Perchè è così?

Quale metodo chiama console.log per stampare l'oggetto?

Si prega di notare che - questo non è un duplicato di questo question.

+0

La tua domanda è limitata a Mozzilla? – Roberto

+0

@Roberto No, non è limitato a Mozzila. – gurvinder372

risposta

7

API Console non è un'API standard che è definito in qualsiasi specifica, ma è qualcosa che viene implementato su tutti i browser, quindi i fornitori sono di solito liberi di implementare nel loro modo in quanto non ci sono specifiche standard per definire l'output di alcun metodo in API.

A meno che non si verifichi l'effettiva implementazione dell'API di console per un particolare browser, non si può mai essere sicuri. C'è un tracker su GitHub che elenca le differenze tra l'implementazione dai principali browser.

Se si guarda l'implementazione in FF (disponibile here - cercare log), ha un commento qui sotto

Una linea più in stringa di un oggetto, progettato per l'utilizzo da parte dell'uomo

L'implementazione effettiva verifica il tipo di argomento passato a log() e in base al tipo, genera una rappresentazione diversa.

Venendo al vostro caso, log() stampe due valori diversi per le stringhe create utilizzando la notazione literal e stringhe create utilizzando String costruttore, perché sono due diversi types. Come spiegato here, le stringhe create usando la notazione letterale sono chiamate String Primitives e le stringhe create utilizzando il costruttore String sono chiamate String Objects.

Poiché i tipi sono diversi, la loro rappresentazione di stringa differisce nell'API di Console. Se si passa attraverso il codice per l'implementazione Console di FF, l'ultima affermazione è

return " " + aThing.toString() + "\n"; 

Quindi, per rispondere alla tua domanda, API Console in FF chiama toString() sull'argomento solo se il tipo argomento non è uno dei {undefined,null,object,set,map} tipi. Non sempre chiama i metodi toString() o valueOf(). Non ho controllato l'implementazione di Chrome, quindi non lo farò.

+0

Grazie, i collegamenti sono stati abbastanza utili – gurvinder372

1

console.log(str) chiamate str.valueOf() Immagino. da JavaScript- La Guida definitiva Il suo compito è quello di convertire un oggetto in un valore primitivo. Il metodo valueOf() viene richiamato automaticamente quando un oggetto viene utilizzato in un contesto numerico, con operatori aritmetici (diversi da +) e con gli operatori relazionali, ad esempio. La maggior parte degli oggetti non ha una rappresentazione primitiva ragionevole e non definisce questo metodo.

--- modificare ---- Siamo spiacenti, copiare la linea sbagliata, mi riferisco al "" + str, dal momento che c'è un tipo di conversione

+5

No, 'console.log (str.valueOf())' e 'console.log (str)' fornisce un'uscita diversa – gurvinder372

1

Esso non utilizza toString, si può fare qualcosa di simile

clog = function(msg){console.log(msg.toString());} 
clog(myObj); 
Problemi correlati