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

在没有附件的Safari中, console.log将显示处于最后执行状态的对象,而不是在调用console.log时的状态。

我必须通过console.log来克隆对象才能获得该行对象的状态。

例:

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

我想你正在寻找console.dir()

console.log()不会做你想做的事情,因为它会打印一个对象的引用,当你popup它的时候,它已经被改变了。 console.dir在您调用对象时打印对象中的属性的目录。

下面的JSON想法是一个好主意。 你甚至可以继续parsingJSONstring,并得到一个可浏览的对象,如.dir()会给你:

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

我通常做的,如果我想看到它的状态在它被logging时,我只是将其转换为JSONstring。

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

香草JS:

@埃文的答案在这里似乎最好。 只是(ab)使用JSON.parse / stringify来有效地制作对象的副本。

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

JQuery的具体解决scheme:

您可以使用jQuery.extend在某个时间点创build一个对象的快照

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

这里实际发生的事情是jQuery创build一个新的对象与test对象的内容,并logging(所以它不会改变)。

AngularJS(1)具体的解决scheme:

Angular提供了一个可用于相同效果的copy函数: angular.copy

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

香草JS包装function:

这是一个封装了console.log的函数,但是在将它们注销之前,将会创build任何对象的副本。

我在回答中写了一些类似但不太健壮的函数。 它支持多个参数,如果它们不是常规对象,将不会尝试复制它们。

 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})

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

例如,

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

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

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

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

我定义了一个工具:

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

当我想login控制台时,我只需要:

 MyLog("hello console!"); 

它工作得很好!

您可能需要以可读的方式logging对象:

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

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

我怎样才能漂亮的打印使用JavaScript的JSON?

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

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

我不知道这是否会导致某些types的图书馆碰撞/核时间/ rip在时空连续。 但它在我的qUnittesting中运行的很好。 🙂

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

有一个选项可以使用debugging器库。

https://debugjs.net/

只需将脚本包含到您的网页,并把日志语句。

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

logging

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

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

 console.dir(object);