5

Powiel możliwe:
Is Chrome's JavaScript console lazy about evaluating arrays?Błąd w console.log?

próbuję następujący kod:

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); 

Rezultatem jest dość dziwne:

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

item-1 

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

item-2 

ALE - jeśli mogę wykonać drugą część po pewnym czasie (przy użyciu setTimeout) i rozłóż pierwszy obiekt, mam rację, to znaczy:

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

item-1 

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

item-2 

uważam, że ważne jest, aby go udostępnić, ponieważ myślę, że jedną puszkę marnuje dużo czasu próbując zrozumieć, co jest nie tak w jego kodzie. A jeśli ktoś ma jakieś odniesienie do otwartego błędu lub coś podobnego - proszę odpowiedzieć na ten bilet. Dzięki!

+2

Która wersja chrom używasz? Na jakiej platformie? Próbowałem uruchomić twój kod w mojej konsoli i otrzymałem poprawną/logiczną odpowiedź –

+0

Jak dokładnie nazwałeś to 'setTimeout'? Próbowałem go również i uzyskałem oczekiwane rezultaty. – jsalonen

+0

To nie jest błąd, to funkcja! Funkcja Console.log przechowuje odwołanie do zalogowanego obiektu, dzięki czemu można wyświetlić podgląd obiektu w środowisku wykonawczym. Jeśli zmieniono atrybut obiektu, to naturalnie ta zmiana jest wyświetlana również w tym podglądzie w czasie rzeczywistym. Możesz spróbować przeszukać obiekt, aby zobaczyć, że jego "hierarchia" jest nieskończenie głęboka, więc nie można go ukryć. – Kasztan

Odpowiedz

0

Brzmi dla mnie bardziej jak stan wyścigowy niż cokolwiek innego. Ponieważ podajesz tylko odniesienie do console.log(), wartość, do której odnosi się, prawdopodobnie zmieniła wartość przez czas, w którym jest faktycznie rejestrowana. Następnie, gdy użyjesz funkcji setTimeout(), wartość zmieni się po jej zarejestrowaniu. Zamiast podania odniesienia do console.log(), należy przekazać klon wartości.

0

Jest to znany problem/funkcja w dzienniku konsoli w niektórych przeglądarkach.

Po zalogowaniu coś może nie zostać natychmiast przekształcone w format tekstowy. Jeśli dziennik zapisuje odniesienie do obiektu, który rejestrujesz, zostanie przekształcony w format tekstowy, gdy faktycznie pojawi się w dzienniku.

Ma to tę zaletę, że rejestrowanie czegoś ma bardzo mały wpływ na wydajność, dopóki nie otworzy się okno dziennika, aby wyświetlić dziennik.

Nawet jeśli okno logowania jest otwarte podczas uruchamiania kodu, nie ma żadnych aktualizacji podczas działania funkcji (ponieważ Javascript jest pojedynczy wątek), więc okno konsoli pokaże wartości na końcu funkcji, gdy okno jest aktualizowane.

3

to known bug (50316) że zostanie zgłoszone ponownie i ponownie, ponieważ ludzie nie spojrzeć na bugtracker przed zgłoszeniem:

Niestety, tam nie ma informacji o tym, czy/kiedy zostanie to rozwiązane. do tego momentu będziesz musiał sklonować obiekty przed przekazaniem ich do console.log().

5

Uważam, że jest to horrendalnie irytująca "funkcja", którą naprawdę chciałbym wyłączyć, sprawia, że ​​debugowanie koszmaru, nie wiedząc, w którym momencie coś mogło zaktualizować obiekt, próbując ustalić dokładne stan obiektu w punkcie nadającym w kodzie. Ta funkcja może być użyteczna dla "punktów obserwacyjnych" itp., Ale nie w tak zwanym "LOG" (wskazówka znajduje się w nazwie).

Rozważmy następujący fragment kodu:

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'. 

, a następnie:

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

bzdura, i pomyślałem, że mam komputer kwantowy, który mógłby zaktualizować wartości, zanim zostały zaktualizowane! – FlavorScape

0

zrobiłem kilka eksperymentów z tym "problemem" w najnowszej wersji Chrome 20.0.1132.57 m.To podsumować Najważniejsze punkty: -

  • console.log() wypisuje odniesienie do obiektu jako "> Obiekt", gdy kod jest wykonywany
  • Wyświetlany jest stan obiektu po kliknięciu trójkąta, niezależnie od wiersza kodu, w którym wykonywana jest konsola console.log().
  • Jeśli chcesz wydrukować obiekt w jego bieżącym stanie, wydrukuj klon console.log(JSON.parse(JSON.stringify(obj)));

można użyć tego fragmentu kodu, aby przetestować to na własnej przeglądarki:

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) ; };