Perché l’object javascript mostra valori diversi nella console in Chrome, Firefox, Safari?

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

Considera questo javascript:

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

Nel firebug di Firefox, questo mostra cosa mi sarei aspettato:

 Object { bar=1111} 1111 Object { bar=2222} 2222 

Tuttavia, nella console di Safari e Chrome mostra:

 Object { bar=2222} 1111 Object { bar=2222} 2222 

In altre parole, l’object mostra gli attributi errati nella console quando si stampa il dump, ma il valore corretto se viene stampato un attributo specifico.

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

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

È un “problema” ben noto, sebbene il comportamento sia il risultato di una decisione di progettazione (si vedano i commenti sul primo link), e quindi non è considerato un bug dal team di sviluppo.

Semplici soluzioni alternative sono qualsiasi mezzo per ottenere un valore non dell’object dell’object, quindi qualsiasi metodo di serializzazione (ad es 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