Qual è la differenza tra console.dir e console.log?


357

In Chrome l' consoleoggetto definisce due metodi che sembrano fare la stessa cosa:

console.log(...)
console.dir(...)

Ho letto da qualche parte online che dirprende una copia dell'oggetto prima di registrarlo, mentre logpassa solo il riferimento alla console, il che significa che quando vai a ispezionare l'oggetto che hai registrato, potrebbe essere cambiato. Tuttavia, alcuni test preliminari suggeriscono che non vi è alcuna differenza e che entrambi soffrono potenzialmente di mostrare oggetti in stati diversi rispetto a quando sono stati registrati.

Prova questo nella console di Chrome ( Ctrl+ Shift+ J) per vedere cosa intendo:

> o = { foo: 1 }
> console.log(o)
> o.foo = 2

Ora, espandi [Object]sotto l'istruzione log e nota che mostra fooun valore di 2. Lo stesso vale se ripeti l'esperimento usando dirinvece di log.

La mia domanda è: perché esistono queste due funzioni apparentemente identiche console?


65
Prova console.log([1,2])e console.dir([1,2])vedrai la differenza.
Felix Kling

In firebug il contenuto di un oggetto registrato console.dirnon cambia, quindi fa una grande differenza.
Eugene Yarmash,

3
Attenzione console.dir(): questa funzionalità non è standard ! Quindi non usarlo in produzione;)
fred727


1
@ user7393973 bella scoperta! In realtà, l'immagine è dalla mia risposta di seguito, quindi è stata effettivamente catturata sul mio laptop. È bello restituire qualcosa a MDN. Che grande risorsa è.
Ha disegnato Noakes il

Risposte:


352

In Firefox, queste funzioni si comportano in modo abbastanza diverso: logstampa solo una toStringrappresentazione, mentre dirstampa un albero navigabile.

In Chrome, logstampa già un albero - il più delle volte . Tuttavia, Chrome logcontinua a stringere determinate classi di oggetti, anche se hanno proprietà. Forse l'esempio più chiaro di differenza è un'espressione regolare:

> console.log(/foo/);
/foo/

> console.dir(/foo/);
* /foo/
    global: false
    ignoreCase: false
    lastIndex: 0
    ...

Puoi anche vedere una chiara differenza con le matrici (ad es. console.dir([1,2,3])) Che sono logdifferenziate dagli oggetti normali:

> console.log([1,2,3])
[1, 2, 3]

> console.dir([1,2,3])
* Array[3]
    0: 1
    1: 2
    2: 3
    length: 3
    * __proto__: Array[0]
        concat: function concat() { [native code] }
        constructor: function Array() { [native code] }
        entries: function entries() { [native code] }
        ...

Anche gli oggetti DOM presentano comportamenti diversi, come indicato in un'altra risposta .


11
Non dimenticare che console.dir mantiene un riferimento all'oggetto. Probabilmente non vorrai usarlo ampiamente in produzione. Probabilmente funziona solo se viene mostrata la console.
Jean-Philippe Leclerc,

In Chromium 45 su Ubuntu, console.logsembra essere la versione semplificata di "Firefox" che sembra toStringun albero anziché un albero. Non sono ancora sicuro di quando lo abbiano cambiato, ma lo hanno fatto.
acqua ghiacciata,

3
@icedwater: dipende dal fatto che la console sia aperta quando si chiama console.logo la si apre in un secondo momento. Sì davvero. :-)
TJ Crowder,

Puoi anche vedere una chiara differenza con Funzione. In Chrome, stamperà il codice sorgente con funzione console.log, ma con console.dir, si possono vedere le prototype, argumentsproprietà.
Tina Chen,

1
Ora sembra che console.loge console.direffettivamente restituire la stessa rappresentazione su [1,2,3]Firefox.
xji,

151

Un'altra differenza utile in Chrome esiste quando si inviano elementi DOM alla console.

Avviso:

  • console.log stampa l'elemento in un albero simile a HTML
  • console.dir stampa l'elemento in un albero simile a JSON

In particolare, console.logdà un trattamento speciale agli elementi DOM, mentreconsole.dir non lo fa. Ciò è spesso utile quando si cerca di vedere la rappresentazione completa dell'oggetto DOM JS.

Sono disponibili ulteriori informazioni nel riferimento API della Console di Chrome su questa e altre funzioni.


Credo che queste informazioni
provengano

11
@ loneshark99 in realtà è il contrario. Hai notato l'URL nel loro screenshot? Hanno copiato la mia risposta. Ma va bene perché è consentito dalla licenza per le risposte SO e adoro MDN comunque.
Drew Noakes,

Capito, è quello che stavo pensando inizialmente, ma poi ho pensato perché avrebbero copiato da qui. Ha senso . Buone informazioni
loneshark99,

4

Penso che Firebug lo faccia diversamente dagli strumenti di sviluppo di Chrome. Sembra che Firebug ti dia una versione rigorosa dell'oggetto mentreconsole.dir ti dà un oggetto espandibile. Entrambi ti danno l'oggetto espandibile in Chrome, e penso che sia da lì che potrebbe nascere la confusione. O è solo un bug in Chrome.

In Chrome, entrambi fanno la stessa cosa. Espandendo il tuo test, ho notato che Chrome ottiene il valore corrente dell'oggetto quando lo espandi.

> o = { foo: 1 }
> console.log(o)
Expand now, o.foo = 1
> o.foo = 2
o.foo is still displayed as 1 from previous lines

> o = { foo: 1 }
> console.log(o)
> o.foo = 2
Expand now, o.foo = 2

Puoi usare quanto segue per ottenere una versione restrittiva di un oggetto se è quello che vuoi vedere. Questo ti mostrerà qual è l'oggetto nel momento in cui viene chiamata questa linea, non quando lo espandi.

console.log(JSON.stringify(o));



0

Seguendo i consigli di Felix Klings l'ho provato nel mio browser Chrome.

console.dir([1,2]) fornisce il seguente output:

Array[2]
 0: 1
 1: 2
 length: 2
 __proto__: Array[0]

Mentre console.log([1,2])fornisce il seguente output:

[1, 2]

Quindi credo che console.dir()dovrebbe essere usato per ottenere maggiori informazioni come prototipo ecc. In matrici e oggetti.


0

Differenza tra console.log()e console.dir():

Ecco la differenza in breve:

  • console.log(input): Il browser accede in modo ben formattato
  • console.dir(input): Il browser registra solo l'oggetto con tutte le sue proprietà

Esempio:

Il seguente codice:

let obj = {a: 1, b: 2};
let DOMel = document.getElementById('foo');
let arr = [1,2,3];

console.log(DOMel);
console.dir(DOMel);

console.log(obj);
console.dir(obj);

console.log(arr);
console.dir(arr);

Registra quanto segue negli strumenti di sviluppo di Google:

inserisci qui la descrizione dell'immagine


0

Nessuna delle 7 risposte precedenti ha detto che console.dirsupporta argomenti extra : depth, showHidden, e se per l'usocolors .

Di particolare interesse è depth, che (in teoria) consente di attraversare oggetti in più dei 2 livelli predefiniti che console.logsupporta.

Ho scritto "in teoria", perché, in pratica, quando ho avuto un oggetto mangusta e corse console.log(mongoose)e console.dir(mongoose, { depth: null }), l'uscita era lo stesso. Ciò che effettivamente ricorreva profondamente mongoosenell'oggetto stava usando util.inspect:

import * as util from 'util';
console.log(util.inspect(myObject, {showHidden: false, depth: null}));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.