如何在Safari中更改console.log的默认行为?

时间:2011-09-12 13:57:57

标签: javascript debugging console logging clone

在没有加载项的Safari中,console.log将在最后执行状态下显示对象,而不是在调用console.log时的状态。

我必须克隆对象只是为了通过console.log输出它来获取该行对象的状态。

示例:

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

11 个答案:

答案 0 :(得分:170)

我认为你正在寻找console.dir()

console.log()没有做你想要的,因为它会打印对象的引用,当你弹出它时,它就会被改变。 console.dir在您调用它时打印对象中属性的目录。

下面的JSON想法很好;你甚至可以继续解析JSON字符串并获得一个可浏览的对象,就像.dir()会给你的那样:

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

答案 1 :(得分:71)

如果我想在记录时看到它的状态,我通常会做的就是将其转换为JSON字符串。

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

答案 2 :(得分:25)

Vanilla JS:

@evan's answer似乎最好。只需(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})

答案 3 :(得分:6)

控制台中的> Object不仅显示当前状态。它实际上是推迟阅读对象及其属性,直到你展开它。

例如,

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

然后展开第一个调用,如果你在第二个console.log返回之前执行它,那么它将是正确的

答案 4 :(得分:2)

使用Xeon06的提示,你可以在一个对象中解析他的JSON,这里是我现在用来转储对象的日志函数:

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

答案 5 :(得分:1)

我定义了一个实用程序:

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

当我想登录控制台时,我只是这样做:

MyLog("hello console!");

效果很好!

答案 6 :(得分:1)

您可能希望以人类可读的方式记录对象:

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

这会使对象在每个级别缩进2个空格。

How can I pretty-print JSON using JavaScript?

答案 7 :(得分:1)

可以选择使用调试器库。

https://debugjs.net/

只需将脚本包含在您的网页中并放入日志语句。

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

登录

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

答案 8 :(得分:0)

我可能会因为暗示这一点而被枪杀,但这可以更进一步。我们可以直接扩展控制台对象本身,使其更加清晰。

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

我不知道这是否会在时空连续体中导致某种类型的库冲突/核熔毁/裂口。但它在我的qUnit测试中运行得很漂亮。 :)

答案 9 :(得分:0)

在您将请求提交到目标网页之前,只需在打开控制台或打开控制台后刷新页面即可....

答案 10 :(得分:-1)

只需在控制台上打印整个对象。

console.dir(object);