2011-11-23 10 views
11

Eventuali duplicati:
Is Chrome's JavaScript console lazy about evaluating arrays?Perché l'oggetto javascript mostra valori diversi nella console in Chrome, Firefox, Safari?

considerare questo javascript:

var foo = {bar : 1111}; 
console.log(foo); 
console.log(foo.bar); 

foo.bar = 2222; 
console.log(foo); 
console.log(foo.bar); 

In Firebug di Firefox, questo dimostra quello che mi sarei aspettato:

Object { bar=1111} 
1111 

Object { bar=2222} 
2222 

Tuttavia, in consolle Safari e Chrome si vede:

Object { bar=2222} 
1111 

Object { bar=2222} 
2222 

In altre parole, l'oggetto sta mostrando gli attributi sbagliate nella console quando stampa oggetto di dumping, ma il valore corretto se un attributo specifico viene stampato.

Si tratta di una stranezza dei browser? O un aspetto fondamentale del javascript orientato agli oggetti che mi manca?

+2

Se dovessi indovinare, direi il debugger sta memorizzando un riferimento all'oggetto in memoria per la prima, e lo stesso valore per il secondo. Poiché il codice aggiorna il riferimento, anche il valore nel debugger che si sta guardando viene aggiornato. Prova totale selvaggia però. –

+2

La migliore ipotesi sarebbe che Safari e Chrome stiano ottimizzando JavaScript e combinando l'assegnazione a foo.bar con la definizione dell'oggetto originale, quindi inserendo il valore previsto di foo.bar nelle due istruzioni di console.log. –

+1

Grazie Mike e John. Sembra che sia così, no? Devo dire, ai miei occhi questo significa che Safari e Chrome mi stanno dicendo bugie sul mio codice mentre sto provando a fare il debug! Se voglio vedere rapidamente cosa contiene un oggetto in due punti del codice durante l'esecuzione, Safari e Chrome non mi forniscono una rappresentazione vera. Forse la mia routine di debug non è abbastanza sofisticata e non dovrei affidarmi alle linee manuali di console.log nel codice? –

risposta

21

In Chrome (WebKit, quindi anche Safari), le chiamate console.log con argomenti oggetto registrano un riferimento a un oggetto. Una volta che la scheda oggetto viene cliccata e aperta, gli interni rimangono costanti (presumibilmente una cache di ordinamenti) e non sono più correlati all'oggetto inizialmente riferito (quindi se in un secondo momento l'oggetto cambia, questo non verrà riflesso). Tuttavia fino a quel punto l'oggetto rimane "non assegnato". Quindi, quando si registra un oggetto più volte, quindi si apre ogni oggetto registrato, puntano tutti allo stesso oggetto in memoria, il cui valore è quello aggiornato più recente.

È un "problema" ben noto, sebbene il comportamento sia il risultato di una decisione di progettazione (vedere i commenti sul primo collegamento), e quindi non è considerato un bug dal team di sviluppo.

Semplici soluzioni alternative sono un mezzo per ottenere un valore non dell'oggetto dell'oggetto, quindi qualsiasi metodo di serializzazione (ad esempio console.log(JSON.stringify(foo));).

https://bugs.webkit.org/show_bug.cgi?id=35801
http://code.google.com/p/chromium/issues/detail?id=44720
http://code.google.com/p/chromium/issues/detail?id=50316

+0

Il bug del webkit: https://bugs.webkit.org/show_bug.cgi?id=35801 –

+0

Grazie. Suppongo che mi serva bene per non usare Firebug! –

+0

Sì, dovrei essere d'accordo è un po 'zoppo .. Rende completamente inutile il 'console.log' per tracciare. Ma immagino che potresti usare un debugger tradizionale per quella roba. –

Problemi correlati