5

Eventuali duplicati:
Is Chrome's JavaScript console lazy about evaluating arrays?Bug in console.log?

provo il seguente codice:

var myList = new Object(); 
var item = new Object(); 
item.text = "item-1"; 
myList[3] = item; 

console.log(myList); 
console.log(myList[3].text); 

// Assign another object to the same entry 
var item2 = new Object(); 
item2.text = "item-2"; 
myList[3] = item2; 

console.log(myList); 
console.log(myList[3].text); 

Il risultato è piuttosto strano:

* Object 
    * 3: Object 
     text: "item-2" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

MA - se eseguo la seconda parte dopo qualche tempo (usando setTimeout), e aprire il primo oggetto, ho capito bene, vale a dire:

* Object 
    * 3: Object 
     text: "item-1" 

item-1 

* Object 
    * 3: Object 
     text: "item-2" 

item-2 

Trovo importante condividere, poiché credo che una lattina sprecare un sacco di tempo cercando di capire cosa c'è che non va nel suo codice. E se qualcuno ha qualche riferimento a un bug aperto o qualcosa del genere - per favore rispondi a questo ticket. Grazie!

+2

Quale versione di Chrome stai usando? Su quale piattaforma? Ho provato a eseguire il codice nella mia console e ottengo la risposta corretta/logica –

+0

Come l'hai chiamata esattamente con 'setTimeout'? Ho provato anche io e ottenere i risultati attesi. – jsalonen

+0

Non è un bug, è una funzionalità! Console.log mantiene il riferimento all'oggetto registrato, quindi è possibile visualizzare l'anteprima dell'oggetto in runtime. Se avevi cambiato l'attributo dell'oggetto, naturalmente questa modifica viene visualizzata anche in questa anteprima in tempo reale. È possibile provare a sfogliare l'oggetto, per vedere che la sua "gerarchia" è infinitamente profonda, quindi è impossibile memorizzarla nella cache. – Kasztan

risposta

0

Mi sembra più una condizione di competizione che altro. Dal momento che stai trasmettendo solo un riferimento a console.log(), il valore a cui si riferisce ha probabilmente cambiato valore nel momento in cui viene effettivamente registrato. Quindi, quando si utilizza setTimeout(), il valore cambia dopo che è stato registrato. Invece di passare un riferimento a console.log(), passare un clone del valore.

0

Questo è un problema/funzionalità noto con il log della console in alcuni browser.

Quando si registra qualcosa, potrebbe non essere trasformato immediatamente in formato testo. Se il log memorizza un riferimento all'oggetto che si registra, verrà convertito in formato testo quando viene effettivamente visualizzato nel registro.

Questo ha il vantaggio che la registrazione di qualcosa ha un impatto molto piccolo sulle prestazioni, finché non si apre effettivamente la finestra di registro per mostrare il registro.

Anche se si ha la finestra di registro aperta mentre si esegue il codice, non si verificano aggiornamenti mentre la funzione è in esecuzione (poiché Javascript è a thread singolo), quindi la finestra della console mostrerà i valori così come sono alla fine della funzione, quando la finestra viene aggiornata.

3

questo è un known bug (50316) che viene segnalato ancora e ancora perché la gente non dare un'occhiata al bugtracker prima di riportare:

purtroppo, non ci sono informazioni su se/quando questo verrà risolto. fino a quel momento, dovrai clonare gli oggetti prima di passarli a console.log().

5

Il mio punto di vista è che si tratta di una "caratteristica" orrendamente irritante che vorrei davvero poter spegnere, rende il debug di un incubo, non sapendo in quale momento qualcosa potrebbe aver aggiornato un oggetto, mentre cercavo di stabilire l'esatto stato dell'oggetto a un punto nel codice. La funzione potrebbe essere utile per "punti di osservazione" ecc., Ma non in qualcosa chiamato "LOG" (l'indizio è nel nome).

Si consideri questo frammento di codice:

var person = {'name':'Tom'}; 
console.log(person); //output the entire object variable 
person.name = 'Thomas'; 
//the output is an object, whose 'name' value is 'Thomas', even though the log statement was placed before the value was changed to 'Thomas'. 

E POI:

var person = {'name':'Tom'}; 
console.log(person.name); //changed to output a string variable 
person.name = 'Thomas'; 
//the output here, however, has not dynamically updated and correctly outputs 'Tom' 
+1

schifo e pensavo di avere un computer quantistico in grado di aggiornare i valori prima che venissero aggiornati! – FlavorScape

0

Ho fatto alcuni esperimenti con questo "problema" sulla più recente versione di Chrome 20.0.1132.57 m.To riassumere la punti chiave: -

  • console.log() stampa un riferimento all'oggetto con come "> Oggetto" quando il codice viene eseguito
  • Viene visualizzato lo stato dell'oggetto quando si fa clic sul triangolo, indipendentemente dalla riga di codice in cui viene eseguito console.log()
  • Se si desidera stampare l'oggetto nel suo stato corrente, stampare un clone console.log(JSON.parse(JSON.stringify(obj)));

si potrebbe utilizzare questo pezzo di codice per verificare questo sul proprio browser:

window.onload = function() {chto = {a : 10, b : 20}; 
console.log('Open this object after 5 seconds') 
console.log(chto); 
console.log('Open this object before 5 seconds') 
console.log(chto); 
console.log('Console of the cloned object') 
console.log(JSON.parse(JSON.stringify(chto))); 
setTimeout(function(){ console.log('5 seconds up'); chto['b'] = 30; },5000) ; };