Pomagałem koledze debugowania kodu dzisiaj i zauważyłem dziwne zachowanie z console.log()
w Google Chrome: WydajeGoogle Chrome console.log() niezgodność z obiektami i tablicami
że jeśli:
Tworzenie zagnieżdżonej tablicy (np [[345 „test”]])
Log tablicę do konsoli z
console.log()
.zmodyfikować jeden z wewnętrznych tablic wartości, a następnie
console.log()
wyjściowy będzie później wartość - nie wartości tablicy w czasieconsole.log()
została wykonana.
JavaScript:
var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]
var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}
var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]
Takie zachowanie nie zdarza się w Firefoksie.
Należy również pamiętać, że jeśli przejdę przez jego linię kodu po linii w debugerze Chrome, to console.log()
wyświetli prawidłowe wartości.
Czy istnieje wyjaśnienie tego dziwnego zjawiska, czy jest to tylko błąd w Google Chrome?
EDIT:
mam zawężony kroki, aby odtworzyć niespójne console.log()
zachowanie:
Jeśli dodasz ten skrypt na swojej stronie:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
i otwórz go w nowe okno z oknem konsoli Chrome już otwarte, wówczas dane wyjściowe console.log()
będą inne niż w przypadku ładowania strony z oknem konsoli zamknięte. Here's a JSFiddle that demonstrates that.
W pierwszym przypadku, przy otwartym oknie konsoli, console.log()
wyświetli bieżącą wartość tablicy (tzn. Dwie pozycje).
W drugim przypadku, w oknie konsoli początkowo zamknięte i otwarte tylko po wczytywania strony console.log()
wyjście będzie późniejsze wartości tablicy (to znaczy trzy pozycje).
Czy jest to błąd w funkcji przeglądarki Google Chrome o numerze console.log()
?
Choć nie wiem jak, dokładnie, to nie jest błąd, Chrome robi tego typu rzeczy z pewną częstotliwością; możesz również rejestrować wynik żądania AJAX; wypełnia go z mocą wsteczną, prawdopodobnie dla jasności podczas logowania. Jestem zbyt nieudolny, aby zacząć wyjaśniać, dlaczego właśnie miałem podobny problem.Każdy kod zależny od poprawnej wartości działałby dobrze. – Jonline
Wygląda na to, że wartość zarejestrowana na konsoli jest wartością * bieżącą *. Dowolna wartość skalarna w obiektach odniesienia nie zostanie obliczona, dopóki nie rozszerzysz obiektów w konsoli Wyjście – Phil
Wydaje się dziwne, że wyniki 'console.log()' będą podlegały warunkom wyścigu. Kiedy przechodziłem przez mój kod współpracowników, 'console.log()' wyprowadzałby wartości, których się spodziewaliśmy, ale przy normalnym wykonywaniu wyprowadzałby później zmodyfikowaną wartość - wydaje się, że chcesz mieć wartości tablicy w dokładny moment 'console.log()' jest wykonywany. –