Comportamento di console.log bizzarro in Strumenti per sviluppatori di Chrome

Possibile duplicato:
La console JavaScript di Chrome è pigro nel valutare gli array?

Apri Chrome Developer Tools e digita:

var a = [];console.log(a);a.push(1);console.log(a);

Ci si aspetterebbe che producesse qualcosa di simile

 [] [1] 

Ma invece emette

 [1] [1] 

Il comportamento è lo stesso per

var a = [];console.log(a);a[0] = 1;console.log(a);

Qualcuno può spiegare questo comportamento?

Esecuzione di Chrome su OS X. Stesso comportamento su Windows 7 a 32 bit.

EDIT : il comportamento è lo stesso indipendentemente dal fatto che le affermazioni siano sulla stessa linea o meno. Li ho semplicemente forniti su una singola riga per renderlo facile da testare.

Mettendo

 var a = []; console.log(a); a.push(1); console.log(a); 

in un file quindi eseguirlo produce lo stesso comportamento.

EDIT x 2 Vedi: http://jsfiddle.net/9N4A6/ se non hai voglia di creare un file da testare.

Prova questo invece:

 var a = []; console.log(a.toString()); a.push(1); console.log(a.toString()); 

Non è che l’ordine di valutazione sia strano, scommetto, ma che la conversione degli oggetti in forma stampabile avviene dopo che tutte le istruzioni sono state eseguite, nel momento in cui Chrome è pronto per scaricare il log.

Stesso comportamento qui con Win7 su una macchina x64. La mia ipotesi è che il metodo di registrazione contenga un riferimento a e accoda le chiamate che si trovano in una singola riga.

EDIT Non è un problema di Chrome / ium da solo, ho visto lo stesso con Firebug. Come ho già detto, la registrazione della console deve essere accodata in qualche modo.

Almeno con gli array, è ansible clonare l’array per ogni chiamata di registro:

 var a = [];console.log([].concat(a));a.push(1);console.log([].concat(a)); 

Per gli oggetti, consiglio JSON:

 var a = {};console.log(JSON.stringify(a));a[0]=1;console.log(JSON.stringify(a)); 

Ciò che viene “registrato” è l’object “a” … non la rappresentazione in chiaro del testo di “a”. Il display del registro è abbastanza intelligente da mostrare un segnaposto per l’object “a”, che viene inserito / popolato “più tardi” (sembra come alla fine dell’invocazione dell’evento). Se inserisci un’istruzione alert (), vedrai i valori che ti aspetti (i valori registrati vengono “compilati”):

 var a = []; console.log(a); alert('force console to display correctly'); a.push(1); console.log(a); 

Questo mi sembra un bug in Chrome (un po ‘buffo dover inserire un’avvertenza per vedere le informazioni di registrazione corrette).

(nota questa domanda mostrata all’inizio di una ricerca su google per “console.log chrome mostra solo i valori correnti” quindi ho pensato di aggiungere la mia risposta)

Sì lo fa anche sugli oggetti …. e se cambi il valore più tardi (diciamo, molti secondi dopo) e poi espandi l’object nella console, il nuovo valore sarà lì dentro. Strano, ma può essere utile in un certo senso.

Se si desidera il valore corrente, basta dire “console.log (a.toString ());” o simili.