2012-06-26 22 views
12

Mögliche Duplizieren:
Is Chrome's JavaScript console lazy about evaluating arrays?Falscher Wert in console.log

Ich habe folgende Schnipsel in Javascript, dessen Ausgang gibt mir das Gefühl, dass etwas nicht in Ordnung ist.

1.

a=2; 
console.log(a); 
a+=2; 
console.log(a); 

Output: 2 4; wie

erwartet

2.

t=[0,2]; 
console.log(t); 
t[0]+=2; 
console.log(t); 

Ausgang: [2,2] [2,2]

Sollte der Ausgang[0,2] [2,2]nicht?Und was ist der Unterschied zwischen den beiden oben genannten Fällen, die zu den verschiedenen Antworten in beiden Fällen führt?

+0

Ich habe Ihre erwartete Ausgabe in der neuesten Version von Chrome. –

+0

Ich habe die erwartete Ausgabe in Firefox. – bjelli

+0

yep, in der neuesten Version von Chrom – gopi1410

Antwort

14

Dies liegt daran, dass das Protokoll verzögert wird, bis Chrome die Zeit dafür hat (d. H. Ihre Skripts geben die CPU frei).

Versuchen, dies zu verstehen, was passiert:

var t=[0,2]; 
console.log(t); 
setTimeout(function() { 
    t[0]+=2; 
    console.log(t); 
}, 1000); 

Es gibt, was Sie erwarten.

Ist das ein Bug von Chrome? Vielleicht ein Nebeneffekt einer Optimierung. Zumindest ist es ein gefährliches Design ...

Warum gibt es einen Unterschied? Ich nehme an, dass Chrome vorübergehend speichert, was es als primärer (unveränderlicher) Wert im ersten Fall als Zeiger auf das Array im letzten Fall protokollieren muss.

+3

yeah, veryyy oft spielen sie mit Feuer – Sebas

+0

yep, scheint Chrom zu machen viele Änderungen in diesen Tagen .. danke btw :) – gopi1410

0

Alles, was Sie tun, ist richtig, aber Chroms Protokollierung ist verrückt/verzögert. Versuchen Sie eine Kopie der Variablen zu erstellen und fügen Sie sie hinzu. Sie werden sehen, dass Ihr Code korrekt ist.

5

console.log in chrome/ff ist asynchron und Objekte, die protokolliert werden, werden zum Zeitpunkt der Erweiterung interpretiert. . macht stattdessen eine Kopie des Objekts, wenn Sie zu dieser Zeit seinen Wert sehen möchten (für ein Array):

t=[0,2]; 
console.log(t.slice(0)); 
t[0]+=2; 
console.log(t); 

Mit einer Reihe, ruft .slice das Array duplizieren und nicht eine Referenz erstellen. Ich würde nicht vorschlagen, eine Auszeit zu verwenden: Dies ist wirklich nicht lösen das Problem, nur umgeht es vorübergehend.

0

Chrome-Protokollierung ist in den neueren Versionen verzögert, kein Problem von Ihrem Ende. Erstellen Sie eine Kopie der Variablen oder verwenden Sie setTimeout.

Verwandte Themen