Jaka jest różnica między konsolą.dir i konsola.log?

W Chrome obiekt console definiuje dwie metody, które wydają się robić to samo:

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

Czytałem gdzieś w Internecie, że dir pobiera kopię obiektu przed zalogowaniem go, podczas gdy log po prostu przekazuje odniesienie do konsoli, co oznacza, że zanim przejdziesz do sprawdzenia zalogowanego obiektu, mógł się on zmienić. Jednak niektóre wstępne testy sugerują, że nie ma różnicy i że oba cierpią z powodu potencjalnie pokazywania obiektów w różnych stanach niż wtedy, gdy byli zalogowani.

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

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

Teraz rozwiń [Object] pod instrukcją log i zauważ, że pokazuje foo z wartością 2. To samo jest prawdą, jeśli powtórzysz eksperyment używając dir zamiast log.

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

Author: Drew Noakes, 2012-08-14

9 answers

W Firefoksie funkcje te zachowują się zupełnie inaczej: log wypisuje tylko reprezentację toString, podczas gdy dir wypisuje drzewo nawigacyjne.

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

> 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 różni się od zwykłych 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] }
        ...

Obiekty DOM również wykazują różne zachowania, jak zaznaczono w innej odpowiedzi.

 367
Author: apsillers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:35

Kolejna użyteczna różnica w Chrome istnieje przy wysyłaniu elementów DOM do konsoli.

Notice:

  • console.log drukuje element w drzewie podobnym do HTML
  • console.dir drukuje element w drzewie podobnym do JSON

W szczególności, {[0] } daje specjalne traktowanie elementom DOM, podczas gdy console.dir nie. Jest to często przydatne, gdy próbuje zobaczyć pełną reprezentację obiektu DOM JS.

Jest więcej informacji w Chrome Console API reference o tej i innych funkcjach.

 159
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 17:11:19

Myślę, że Firebug robi to inaczej niż narzędzia dev Chrome. Wygląda na to, że Firebug daje stringową wersję obiektu, podczas gdy console.dir daje rozszerzalny obiekt. Oba dają rozszerzalny obiekt w Chrome i myślę, że stąd może pochodzić zamieszanie. Albo to tylko błąd w Chrome.

W Chrome, oba robią to samo. Rozwijając swój test, zauważyłem, że Chrome pobiera bieżącą wartość obiektu po rozwinięciu go.

> 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ć poniżej, aby uzyskać stringową wersję obiektu, jeśli to jest to, co chcesz zobaczyć. To pokaże Ci, czym jest obiekt w momencie wywołania tej linii, a nie po jej rozwinięciu.

console.log(JSON.stringify(o));
 4
Author: sachleen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-14 14:25:15

Użyj konsoli.dir() aby wypisać obiekt, który można przeglądać, można kliknąć zamiast .wersja toString (), jak Ta:

console.dir(obj/this/anything)

Jak wyświetlić pełny obiekt w konsoli Chrome?

 3
Author: Scorpion-Prince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:26

Ze strony firebug http://getfirebug.com/logging/

Wywołanie konsoli.dir (object) zarejestruje interaktywną listę właściwości obiektu, na przykład > miniaturową wersję karty DOM.

 2
Author: Dries Marien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-14 14:13:26

Żadna z 7 wcześniejszych odpowiedzi nie wspomniała, że console.dir obsługuje dodatkowe argumenty: depth, showHidden, i czy używać colors.

Szczególnie interesująca jest depth, która (teoretycznie) umożliwia przemieszczanie obiektów na więcej niż domyślne 2 poziomy, które obsługuje console.log.

Napisałem "w teorii", ponieważ w praktyce, gdy miałem obiekt mangusty i uruchomiłem console.log(mongoose) i console.dir(mongoose, { depth: null }), wynik był taki sam. To, co faktycznie weszło głęboko w obiekt mongoose było za pomocą util.inspect:

import * as util from 'util';
console.log(util.inspect(myObject, {showHidden: false, depth: null}));
 1
Author: Dan Dascalescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-27 10:45:00

Za radą Felixa Klingsa wypróbowałem go w przeglądarce chrome.

console.dir([1,2]) daje następujące wyjście:

Array[2]
 0: 1
 1: 2
 length: 2
 __proto__: Array[0]

While console.log([1,2]) daje następujące wyjście:

[1, 2]

Więc uważam, że console.dir() powinny być używane do uzyskania większej ilości informacji, takich jak prototyp itp. w tablicach i obiektach.

 0
Author: Bimal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-01 23:51:38

Różnica między console.log() A console.dir():

Oto różnica w skrócie:

  • console.log(input): przeglądarka loguje się w ładnie sformatowany sposób
  • console.dir(input): przeglądarka rejestruje tylko obiekt ze wszystkimi jego właściwościami

Przykład:

Następujący kod:

let obj = {a: 1, b: 2};
let DOMel = document.getElementById('foo');
let arr = [1,2,3];

console.log(DOMel);
console.dir(DOMel);

console.log(obj);
console.dir(obj);

console.log(arr);
console.dir(arr);

Zapisuje w narzędziach Google dev:

Tutaj wpisz opis obrazka

 0
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-20 19:55:45

Cóż, Standard konsoli (od zatwierdzenia ef88ec7a39fdfe79481d7d8f2159e4a323e89648) aktualnie wywołuje konsolę.dir Aby zastosować ogólne formatowanie obiektów JavaScriptprzed przekazaniem go do drukarki (Operacja na poziomie specyfikacji), ale dla konsoli z jednym argumentem .log call, spec kończy się przekazaniem obiektu JavaScript bezpośrednio do drukarki .

Ponieważ spec faktycznie pozostawia prawie wszystko o drukarce działanie do implementacji, to pozostaje do ich uznania, jakiego typu formatowania użyć dla konsoli.log ().

 0
Author: SamB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-03 00:06:59