it-roy-ru.com

Как я могу изменить поведение по умолчанию console.log в Safari?

В Safari без надстроек console.log будет показывать объект в последнем состоянии выполнения, а не в том состоянии, когда был вызван console.log.

Я должен клонировать объект, просто чтобы вывести его через console.log, чтобы получить состояние объекта в этой строке.

Пример:

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

Я думаю, что вы ищете console.dir().

console.log() не делает то, что вы хотите, потому что он печатает ссылку на объект, и когда вы открываете его, он меняется. console.dir печатает каталог свойств объекта во время его вызова.

Идея JSON ниже хороша; Вы можете даже проанализировать строку JSON и получить объект для просмотра, например, что даст вам .dir ():

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

170
evan

Что я обычно делаю, если я хочу видеть его состояние во время регистрации, я просто конвертирую его в строку JSON.

console.log(JSON.stringify(a));
71
Alex Turpin

Ваниль JS:

@ Эван ответ кажется, лучше здесь. Просто (ab) используйте JSON.parse/stringify, чтобы эффективно сделать копию объекта.

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

JQuery конкретное решение:

Вы можете создать снимок объекта в определенный момент времени с помощью jQuery.extend

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

Здесь на самом деле происходит то, что jQuery создает новый объект с содержимым объекта test и регистрирует его (так что он не изменится).

AngularJS (1) конкретное решение:

Angular предоставляет функцию 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})

25
Zach Lysobey

Этот > Object в консоли не только показывает текущее состояние. Это фактически задерживает чтение объекта и его свойств до тех пор, пока вы его не развернете.

Например,

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

Затем разверните первый вызов, это будет правильно, если вы сделаете это до того, как второй console.log вернется

6
Joe

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

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

Возможно, вы захотите записать объект в удобочитаемом виде:

console.log(JSON.stringify(myObject, null, 2));

Это делает отступ для объекта с 2 пробелами на каждом уровне.

Как я могу красиво печатать JSON с помощью JavaScript?

1
Andrew

Я определил утилиту:

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

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

MyLog("hello console!");

Это работает очень хорошо!

1
Migio B

Существует возможность использовать библиотеку отладчика.

https://debugjs.net/

Просто включите скрипт на свою веб-страницу и поместите в журнал выписки.

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

Логирование

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

Просто обновите страницу после того, как вы откроете консоль или откроете консоль, прежде чем отправить запрос на целевую страницу ....

0
A. Qaoud

Я могу быть застрелен за то, что предложил это, но это может быть сделано еще на один шаг вперед. Мы можем напрямую расширить консольный объект, чтобы сделать его более понятным.

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

Я не знаю, вызовет ли это какой-то тип столкновения библиотеки/ядерного распада/разрыва в континууме пространства-времени. Но это прекрасно работает в моих тестах qUnit. :)

0
Dave