Как изменить поведение по умолчанию 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}

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Vanilla JS:

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

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

Специальное решение JQuery:

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

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

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

Угловое решение (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})

Ответ 4

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

Например,

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

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

Ответ 5

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

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

Ответ 6

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

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

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

MyLog("hello console!");

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

Ответ 8

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

https://debugjs.net/

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

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

Logging

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

Просто напечатайте весь объект на консоли.

console.dir(object);