如何在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器库。
只需将脚本包含到您的网页,并把日志语句。
<script src="debug.js"></script>
logging
var test = {a: true} log(test); // {a: true} test.a = false; log(test); // {a: false}
只需在控制台上打印整个对象。
console.dir(object);