在没有附加组件的 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}
我想你正在寻找console.dir()
.
console.log()
不会做你想做的事,因为它打印了一个对对象的引用,当你打开它时,它已经改变了。console.dir
在您调用它时打印对象中属性的目录。
下面的 JSON 想法是一个很好的想法;你甚至可以继续解析 JSON 字符串并获得一个可浏览的对象,就像 .dir() 会给你的:
console.log(JSON.parse(JSON.stringify(obj)));
如果我想查看它在记录时的状态,我通常会做的就是将其转换为 JSON 字符串。
console.log(JSON.stringify(a));
@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})
这> Object
在控制台中,不仅显示当前状态。它实际上是推迟读取对象及其属性,直到您展开它。
例如,
var test = {a: true}
console.log(test);
setTimeout(function () {
test.a = false;
console.log(test);
}, 4000);
然后展开第一个调用,就对了,如果你在第二个console.log
返回之前做
使用 Xeon06 的提示,您可以在对象中解析他的 JSON,这是我现在用来转储对象的日志函数:
function odump(o){
console.log($.parseJSON(JSON.stringify(o)));
}