2012-08-14 11 views
256

W Chrome przedmiotem console definiuje dwie metody, które wydają się zrobić to samo:Jaka jest różnica między konsolą console.dir a konsolą.log?

console.log(...) 
console.dir(...) 

Czytałem gdzieś w Internecie, że dir wykonuje kopię obiektu przed zalogowaniem się, natomiast log tylko przekazuje odwołanie do konsoli , co oznacza, że ​​do czasu sprawdzenia zarejestrowanego obiektu mogło się to zmienić. Jednak niektóre wstępne testy sugerują, że nie ma różnicy i że obaj cierpią z powodu potencjalnego pokazywania obiektów w różnych stanach, niż kiedy byli zalogowani.

Spróbuj w konsoli Chrome (Ctrl + Przesunięcie + J), aby zobaczyć, co mam na myśli:

> o = { foo: 1 } 
> console.log(o) 
> o.foo = 2 

Teraz rozwiń [Object] pod oświadczeniem dziennika i zauważ, że to pokazuje foo o wartości 2. To samo dotyczy powtórzenia eksperymentu z użyciem dir zamiast .

Moje pytanie brzmi: dlaczego te dwie pozornie identyczne funkcje istnieją na console?

+51

Wypróbuj 'console.log ([1,2])' i 'console.dir ([1,2])' a zobaczysz różnicę. –

+0

W firebug zawartość obiektu zarejestrowanego za pomocą 'console.dir' nie zmienia się, więc robi dużą różnicę. –

+3

Należy zachować ostrożność w 'console.dir()': ta funkcja jest [niestandardowa] (https://developer.mozilla.org/docs/Web/API/Console/dir)! Więc nie używaj go do produkcji;) – fred727

Odpowiedz

245

W Firefoksie, to funkcja zachowują się zupełnie inaczej: log drukuje tylko na zewnątrz toString reprezentację, natomiast dir wypisuje żeglowna drzew.

W Chrome, log już wypisuje drzewo - przez większość czasu. Jednak Chrome log nadal koduje pewne klasy obiektów, nawet jeśli mają one właściwości.Być może najlepszym przykładem różnicy jest wyrażeniem regularnym:

> console.log(/foo/); 
/foo/ 

> console.dir(/foo/); 
* /foo/ 
    global: false 
    ignoreCase: false 
    lastIndex: 0 
    ... 

Można również zobaczyć wyraźną różnicę z tablicami (np console.dir([1,2,3])), które są log ged inaczej od normalnych obiektów:

> console.log([1,2,3]) 
[1, 2, 3] 

> console.dir([1,2,3]) 
* Array[3] 
    0: 1 
    1: 2 
    2: 3 
    length: 3 
    * __proto__: Array[0] 
     concat: function concat() { [native code] } 
     constructor: function Array() { [native code] } 
     entries: function entries() { [native code] } 
     ... 

DOM obiekty wykazują również różne zachowania, as noted on another answer.

+7

Nie zapominaj, że plik console.dir odwołuje się do obiektu. Prawdopodobnie nie chcesz używać go intensywnie w produkcji. Prawdopodobnie działa tylko wtedy, gdy konsola jest pokazywana. –

+0

W Chromium 45 na Ubuntu, 'console.log' wydaje się być uproszczoną wersją" Firefox ", która wygląda raczej jak' toString' niż drzewo. Nie jestem jeszcze pewien, kiedy to zmienili, ale tak się stało. – icedwater

+1

@icedwater: Zależy od tego, czy masz konsolę otwartą, gdy wywołasz 'console.log' lub otworzysz ją później. Tak naprawdę. :-) –

2

Z witryny firebug http://getfirebug.com/logging/

Wywołanie console.dir (Object) zanotuje interaktywną listę właściwości obiektu, jak> miniaturowa wersja karcie DOM.

4

myślę Firebug robi to inaczej niż narzędzia deweloperskie Chrome. Wygląda na to, że Firebug daje ci usztywnioną wersję obiektu, podczas gdy console.dir daje ci rozszerzalny obiekt. Oba dają rozszerzalny obiekt w Chrome i myślę, że to stąd może powstać zamieszanie. Lub jest to po prostu błąd w Chrome.

W Chrome obie robią to samo. Rozszerzając Twój test, zauważyłem, że Chrome pobiera aktualną wartość obiektu podczas jego rozwijania.

> o = { foo: 1 } 
> console.log(o) 
Expand now, o.foo = 1 
> o.foo = 2 
o.foo is still displayed as 1 from previous lines 

> o = { foo: 1 } 
> console.log(o) 
> o.foo = 2 
Expand now, o.foo = 2 

Możesz użyć następujących opcji, aby uzyskać usztywnioną wersję obiektu, jeśli chcesz to zobaczyć. Spowoduje to wyświetlenie obiektu w momencie wywołania tej linii, a nie jej rozwinięcia.

console.log(JSON.stringify(o)); 
0

W następstwie porady Felixa Klingsa wypróbowałem ją w mojej przeglądarce Chrome.

console.dir ([1,2]) daje następujący wynik:

Array [2]

0: 1

1: 2

długość: 2

_ proto _: Tablica [0]

Podczas console.log ([1,2]) daje następujący wynik:

[1, 2]

Wierzę, że konsola console.dir() powinna być używana w celu uzyskania dodatkowych informacji, takich jak prototyp itp. W tablicach i obiektach.

100

Kolejna użyteczna różnica w Chrome występuje podczas wysyłania elementów DOM do konsoli.

Wskazówka:

  • console.log drukuje element w drzewie HTML-jak
  • console.dir drukuje element w drzewie JSON-like

Zwłaszcza console.log daje specjalne traktowanie elementów DOM, podczas gdy console.dir nie. Jest to często przydatne przy próbie zobaczenia pełnej reprezentacji obiektu DOM JS.

W tej Chrome Console API reference jest więcej informacji na temat tej i innych funkcji.

+0

Wierzę, że ta informacja pochodzi z https://developer.mozilla.org/en-US/docs/Web/API/Console/log – loneshark99

+0

@ loneshark99 w rzeczywistości jest odwrotnie. Zwróć uwagę na adres URL na zrzucie ekranu? Skopiowali moją odpowiedź. Ale to jest w porządku, ponieważ jest to dozwolone przez licencję na odpowiedzi SO i kocham MDN tak czy inaczej. –

+0

Rozumiem, to było to, co początkowo myślałem, ale potem pomyślałem, dlaczego skopiowaliby stąd. Ma sens . Dobra informacja – loneshark99

Powiązane problemy