在没有附加组件的Safari(实际上是大多数其他浏览器)中,console.log
将在最后执行状态而不是在console.log
调用时的状态下显示对象。
我必须克隆对象只是为了通过它输出console.log
以获取该行的对象状态。
例:
var test = {a: true}
console.log(test); // {a: false}
test.a = false;
console.log(test); // {a: false}
在没有附加组件的Safari(实际上是大多数其他浏览器)中,console.log
将在最后执行状态而不是在console.log
调用时的状态下显示对象。
我必须克隆对象只是为了通过它输出console.log
以获取该行的对象状态。
例:
var test = {a: true}
console.log(test); // {a: false}
test.a = false;
console.log(test); // {a: false}
Answers:
我认为您正在寻找console.dir()
。
console.log()
不会执行您想要的操作,因为它会打印对对象的引用,并且在您将其弹出时将其更改。console.dir
调用时在对象中打印属性的目录。
下面的JSON想法是一个好主意;您甚至可以继续解析JSON字符串,并获得类似.dir()的可浏览对象:
console.log(JSON.parse(JSON.stringify(obj)));
console.log
和之间没有区别console.dir
console.dir
,在Chrome浏览器(v33)中也不起作用。这是人们提供的解决方案的比较:jsfiddle.net/luken/M6295
如果要在记录日志时查看其状态,通常要做的就是将其转换为JSON字符串。
console.log(JSON.stringify(a));
function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }
@evan的答案似乎在这里最好。只需(ab)使用JSON.parse / stringify有效地复制对象。
console.log(JSON.parse(JSON.stringify(test)));
您可以使用以下命令在某个时间点创建对象的快照: jQuery.extend
console.log($.extend({}, test));
此处实际发生的情况是jQuery正在使用test
对象的内容创建一个新对象,并对其进行记录(因此它不会更改)。
Angular提供了copy
可以用来达到相同效果的函数:angular.copy
console.log(angular.copy(test));
这是一个包装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})
您可能希望以易于理解的方式记录对象:
console.log(JSON.stringify(myObject, null, 2));
这会使对象在每个级别上缩进2个空格。
有一个使用调试器库的选项。
只需将脚本包含在您的网页中并放入日志语句即可。
<script src="debug.js"></script>
记录中
var test = {a: true}
log(test); // {a: true}
test.a = false;
log(test); // {a: false}
我可能会建议这样做,但可以采取进一步的措施。我们可以直接扩展控制台对象本身以使其更加清晰。
console.logObject = function(o) {
(JSON.stringify(o));
}
我不知道这是否会引起时空连续体中某种类型的库碰撞/核熔毁/破裂。但这在我的qUnit测试中效果很好。:)
只需在控制台上打印整个对象。
console.dir(object);