Яка різниця між console.dir та console.log?


357

У Chrome consoleоб’єкт визначає два методи, які, здається, роблять те саме:

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

Я читав десь в Інтернеті, що dirбере копію об’єкта перед тим, як ввійти до нього, тоді як logпросто передає посилання на консоль, це означає, що до моменту переходу до огляду об’єкта, який ви зареєстрували, він, можливо, змінився. Однак деякі попередні тестування свідчать, що різниці немає і що вони обидва страждають від потенційно показаних об'єктів у різних станах, ніж коли вони були зареєстровані.

Спробуйте це на консолі Chrome ( Ctrl+ Shift+ J), щоб побачити, що я маю на увазі:

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

Тепер розгорніть [Object]під оператором журнал і помітьте, що він відображається fooзі значенням 2. Те ж саме, якщо повторити експеримент, використовуючи dirзамість log.

Моє питання: чому існують ці дві, здавалося б, однакові функції console?


65
Спробуйте console.log([1,2])і console.dir([1,2])ви побачите різницю.
Фелікс Клінг

В Firebug вміст об'єкта, на який було зареєстровано console.dir, не змінюється, тому це робить велику різницю.
Євген Ярмаш

3
Будьте обережні console.dir(): ця функція нестандартна ! Тому не використовуйте його на виробництві;)
fred727


1
@ user7393973 приємна знахідка! Власне, зображення з моєї відповіді нижче, тому насправді було знято на моєму ноутбуці. Приємно повернути щось в MDN. Який це чудовий ресурс.
Дрю Ноакс

Відповіді:


352

У Firefox ці функції поводяться зовсім інакше: logвиводить лише toStringпредставлення, тоді як dirдрукує дерево навігації.

У Chrome logвже виводиться дерево - більшість часу . Однак, Chrome logвсе ще впорядковує певні класи об’єктів, навіть якщо вони мають властивості. Мабуть, найясніший приклад різниці - регулярний вираз:

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

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

Ви також можете помітити чітку різницю з масивами (наприклад, console.dir([1,2,3])), які logged відрізняються від звичайних об'єктів:

> 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 також проявляють різну поведінку, як зазначалося в іншій відповіді .


11
Не забувайте, що console.dir зберігає посилання на об'єкт. Напевно, ви не хочете широко використовувати його у виробництві. Це, ймовірно, працює лише в тому випадку, якщо на консолі показано tho.
Жан-Філіп Леклерк

У Chromium 45 на Ubuntu, console.logсхоже, спрощена версія "Firefox", яка схожа toStringна дерево, а не на дерево. Я ще не впевнений, коли вони це змінили, але вони це зробили.
крижана вода

3
@icedwater: Залежить від того, чи буде ви відкрита консоль під час дзвінка console.logчи відкрийте її пізніше. Так, насправді. :-)
TJ Crowder

Ви також можете побачити чітку різницю за допомогою функції. У хромі він буде друкувати вихідний код функції з console.log, але з console.dir, можна побачити prototype, argumentsвластивостями.
Тіна Чен

1
Тепер, здається, це console.logі console.dirнасправді повернути те саме представлення [1,2,3]у Firefox.
xji

151

Ще одна корисна відмінність у Chrome існує при надсиланні елементів DOM на консоль.

Зверніть увагу:

  • console.log друкує елемент у дереві, подібному до HTML
  • console.dir друкує елемент у дереві, подібному до JSON

Зокрема, console.logнадає особливу обробку елементам DOM, тоді якconsole.dir ні. Це часто корисно, намагаючись побачити повне представлення об'єкта DOM JS.

У довідці API консолі Chrome є додаткові відомості про цю та інші функції.


Я вважаю, що ця інформація є від developer.mozilla.org/en-US/docs/Web/API/Console/log
loneshark99

11
@ loneshark99 насправді це навпаки. Помітили URL-адресу на їхньому екрані? Вони скопіювали мою відповідь. Але це добре, бо це дозволено ліцензією на відповіді ТА, і я все одно люблю MDN.
Дрю Ноакс

Зрозумів, це те, що я спочатку думав, але потім думав, чому вони будуть копіювати звідси. Має сенс . Хороша інформація
loneshark99

4

Я думаю, що Firebug робить це інакше, ніж розробники інструментів Chrome. Схоже, Firebug надає вам раціоналізовану версію об'єктаconsole.dir надає об’єкт, що розгортається. Обидва дають вам об’єкт, що розгортається, у Chrome, і я думаю, що саме тут може виникнути плутанина. Або це просто помилка в Chrome.

У Chrome обидва роблять те саме. Розширюючи тест, я помітив, що Chrome отримує поточне значення об'єкта, коли ви розгортаєте його.

> 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

Ви можете скористатися наступним, щоб отримати версифіковану версію об'єкта, якщо це саме ви хочете бачити. Це покаже вам, який об’єкт знаходиться в момент, коли ця лінія називається, а не тоді, коли ви її розгортаєте.

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



0

Дотримуючись поради Фелікса Клінга, я спробував це у своєму хромовому браузері.

console.dir([1,2]) дає такий вихід:

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

Хоча console.log([1,2])дає наступний вихід:

[1, 2]

Тому я вважаю, що console.dir()слід використовувати для отримання додаткової інформації, як прототип тощо, у масивах та об'єктах.


0

Різниця між console.log()іconsole.dir() :

Ось різниця в двох словах:

  • console.log(input): Веб-переглядач веде журнал у добре відформатованому вигляді
  • console.dir(input): Браузер записує лише об’єкт із усіма його властивостями

Приклад:

Наступний код:

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

Журнали в інструментах Google Dev:

введіть тут опис зображення


0

Жоден з 7 попередніх відповідей не вказано , що console.dirпідтримує додаткові аргументи : depth, showHidden, і варто використовуватиcolors .

Особливий інтерес представляє те depth, що (теоретично) дозволяє переміщувати об'єкти на більш ніж 2 рівні за замовчуванням, які console.logпідтримуються.

Я писав "теоретично", тому що на практиці, коли в мене був об'єкт "Мангуста", я бігав console.log(mongoose)і console.dir(mongoose, { depth: null }), вихід був таким самим. Що на насправді Рекурсія глибоко в mongooseоб'єкт був з допомогою util.inspect:

import * as util from 'util';
console.log(util.inspect(myObject, {showHidden: false, depth: null}));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.