在没有附加组件的Safari中(实际上是大多数其他浏览器),console.log
将在最后一次执行时显示对象,而不是在调用console.log
时的状态。
我必须克隆该对象,以便通过console.log
输出该对象,以获得该行对象的状态。
示例:
var test = {a: true}
console.log(test); // {a: false}
test.a = false;
console.log(test); // {a: false}
发布于 2011-09-12 22:06:20
我想你是在找console.dir()
吧。
调用对象时,console.dir
会打印对象中的属性目录。
下面的JSON想法很好;您甚至可以继续解析JSON字符串,并获得一个可浏览的对象,就像.dir()所提供的那样:
console.log(JSON.parse(JSON.stringify(obj)));
发布于 2011-09-12 22:10:55
如果我想查看它在被记录时的状态,我通常会做的就是将它转换成JSON字符串。
console.log(JSON.stringify(a));
发布于 2013-03-12 23:04:55
香草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})
https://stackoverflow.com/questions/7389069
复制相似问题