Як я можу зробити так, щоб console.log відображав поточний стан об'єкта?


146

У Safari без додаткових додатків (і насправді більшості інших браузерів) console.logбуде показано об'єкт в останньому стані виконання, а не в стані, коли console.logйого викликали.

Мені доводиться клонувати об’єкт просто для того, щоб вивести його через, console.logщоб отримати стан об'єкта в цій лінії.

Приклад:

var test = {a: true}
console.log(test); // {a: false}
test.a = false; 
console.log(test); // {a: false}

2
jsfiddle приклад проблеми та різних рішень, наведених нижче: jsfiddle.net/luken/M6295
Лука

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

2
Як я ніколи раніше цього не переживав? Мене це лякає
ErikAGriffin

Відповіді:


172

Я думаю, ти шукаєш console.dir().

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

Нижче наведена ідея JSON; ви навіть можете продовжити розбір рядка JSON і отримати об'єкт, який можна переглянути, як, наприклад, те, що .dir () дасть вам:

console.log(JSON.parse(JSON.stringify(obj)));


38
Для мене в Chrome13 немає різниці між console.logіconsole.dir
Ендрю Д.

Гм, це дивно - це працює у Firebug. Я думав, що це так само і в Webkit.
evan

1
Що я бачу в Chrome, це те, що якщо ви відкриєте консоль після запуску оператора журналу, це зробить ледачу оцінку, коли ви розгорнете її. Але якщо консоль уже відкрита (наприклад, ви відкриєте консоль, а потім натисніть кнопку оновлення на сторінці), вона зробить нетерплячу оцінку - тобто надрукує значення в момент запуску оператора журналу.
Полеарх

6
Крім того, dir - це JSON, оскільки дрібне копіювання - це глибоке копіювання. console.dir () оцінить лише властивості об'єкта верхнього рівня (інші більш глибоко вкладені об'єкти не будуть оцінені), тоді як JSON буде рекурсивно.
Полеарх

9
Так само для мене console.dirне працює в Chrome (v33). Ось порівняння запропонованих людьми рішень: jsfiddle.net/luken/M6295
Лука

71

Що я зазвичай роблю, якщо хочу побачити стан у момент його реєстрації - це просто перетворити його в рядок JSON.

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

4
Чудово, це був приємний натяк для мене: мені просто довелося його проаналізувати ще раз, щоб мати свій об’єкт прямо в консолі. function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }
Кріс

1
дякую, це працює для мене! console.dir не надрукував її
ах-шианг хан

1
що робити, якщо ваш об'єкт містить кругову структуру?
Алекс Макміллан

1
@AlexMcMillan Ви можете використовувати одну з декількох бібліотек, які дозволяють JSON-розбиткові об'єкти з круговими посиланнями.
Алекс Турпін

7
Гез. Це має бути простим, очевидним, що можна зробити. Натомість нам доведеться строковувати, аналізувати, проводити журнал та використовувати спеціальну кругову бібліотеку довідок!?! Я думаю, що браузерам потрібно зробити кращу роботу щодо підтримки простих потреб у налагодженні.
Марс

26

Ванільний JS:

Тут найкраще виглядає відповідь @ evan . Просто (ab) використовуйте JSON.parse / stringify, щоб ефективно зробити копію об'єкта.

console.log(JSON.parse(JSON.stringify(test)));

Специфічне рішення JQuery:

Ви можете створити знімок об’єкта в певний момент за допомогою jQuery.extend

console.log($.extend({}, test));

Що насправді відбувається тут, це jQuery - це створити новий об'єкт із testвмістом об'єкта, і записати його (щоб він не змінився).

Специфічне рішення AngularJS (1):

Кутовий забезпечує copyфункцію, яку можна використовувати для того ж ефекту:angular.copy

console.log(angular.copy(test));

Функція обгортки Vanilla JS:

Ось функція, яка обгортає, console.logале зробить копію будь-яких об'єктів, перш ніж виходити з них.

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

function consoleLogWithObjectCopy () {
  var args = [].slice.call(arguments);
  var argsWithObjectCopies = args.map(copyIfRegularObject)
  return console.log.apply(console, argsWithObjectCopies)
}

function copyIfRegularObject (o) {
  const isRegularObject = typeof o === 'object' && !(o instanceof RegExp)
  return isRegularObject ? copyObject(o) : o
}

function copyObject (o) {
  return JSON.parse(JSON.stringify(o))
}

Приклад використання :consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})


6

Це > Objectв консолі, не показує лише поточний стан. Насправді це відкладає зчитування об'єкта та його властивостей, поки ви не розгорнете його.

Наприклад,

var test = {a: true}
console.log(test);
setTimeout(function () {
    test.a = false; 
    console.log(test);
}, 4000);

Потім розгорніть перший дзвінок, він буде правильним, якщо ви зробите це до console.logповернення другого


2

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

function odump(o){
   console.log($.parseJSON(JSON.stringify(o)));
}

1

Я визначив утиліту:

function MyLog(text) {
    console.log(JSON.stringify(text));
}

і коли я хочу увійти на консоль, я просто роблю:

MyLog("hello console!");

Це працює дуже добре!



1

Є можливість використовувати налагоджувальну бібліотеку.

https://debugjs.net/

Просто включіть скрипт на свою веб-сторінку і поставте виписки з журналу.

<script src="debug.js"></script>

Ведення журналів

var test = {a: true}
log(test); // {a: true}
test.a = false; 
log(test); // {a: false}

0

Мене можуть зняти за те, що я запропонував це зробити, але це можна зробити ще на крок. Ми можемо безпосередньо розширити сам об’єкт консолі, щоб зробити його більш зрозумілим.

console.logObject = function(o) {
  (JSON.stringify(o));
}

Я не знаю, чи це спричинить якийсь тип бібліотечного зіткнення / ядерного обвалу / розриву в континуумі космічного часу. Але це прекрасно працює в моїх тестах qUnit. :)


1
Це нічого не записує. Він просто ковтає результат чогось посилення. Смішно, що його отримали відгуки
Зах Лісобей

0

Просто оновіть сторінку після відкриття консолі або відкриття консолі, перш ніж надсилати запит на цільову сторінку ....


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.