Как изменить поведение по умолчанию 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!");
Это работает очень хорошо!
Ответ 7
Возможно, вы захотите записать объект по-человечески:
console.log(JSON.stringify(myObject, null, 2));
Это отбрасывает объект с двумя пробелами на каждом уровне.
Как я могу печатать JSON с помощью JavaScript?
Ответ 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);