如何让 console.log 显示对象的当前状态?

IT技术 javascript debugging logging console console.log
2021-01-30 13:18:47

在没有附加组件的 Safari(实际上是大多数其他浏览器)中,console.log将在最后执行状态显示对象,而不是在console.log被调用时的状态

我必须克隆对象只是为了通过输出它console.log来获取该行对象的状态。

例子:

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

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

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

下面的 JSON 想法是一个很好的想法;你甚至可以继续解析 JSON 字符串并获得一个可浏览的对象,就像 .dir() 会给你的:

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

我在 Chrome 中看到的是,如果您在 log 语句运行后打开控制台,那么在您展开它时它会进行惰性求值。但是如果控制台已经打开(例如你打开控制台然后在页面上点击刷新),它会进行急切评估——即打印日志语句运行时的值。
2021-03-16 13:18:47
同样对我来说console.dir在 Chrome (v33) 中不起作用。这是人们提供的解决方案的比较:jsfiddle.net/luken/M6295
2021-03-23 13:18:47
嗯,这很令人惊讶 - 它在 Firebug 中有效。我原以为在 Webkit 中也是如此。
2021-03-25 13:18:47
对我来说在 Chrome13console.log之间没有区别console.dir
2021-03-28 13:18:47
此外,dir 之于 JSON,就像浅拷贝之于深拷贝一样。console.dir() 只会评估顶级对象的属性(不会评估其他更深层嵌套的对象),而 JSON 将递归执行。
2021-03-28 13:18:47

如果我想查看它在记录时的状态,我通常会做的就是将其转换为 JSON 字符串。

console.log(JSON.stringify(a));
谢谢这对我有用!console.dir 没有打印出来
2021-03-19 13:18:47
天啊。这应该是一件简单、显而易见的事情。相反,我们必须字符串化、解析、记录和使用特殊的循环引用库!?!我认为浏览器需要更好地支持简单的调试需求。
2021-03-20 13:18:47
如果您的对象碰巧包含圆形结构怎么办?
2021-03-26 13:18:47
太好了,这对我来说是一个很好的提示:我只需要再次解析它就可以将我的对象放在控制台中。 function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }
2021-04-04 13:18:47
@AlexMcMillan你可以使用一个 几个库,允许与循环引用对象的JSON字符串化。
2021-04-09 13:18:47

香草JS:

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

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

JQuery具体解决方案:

您可以使用以下命令在某个时间点创建对象的快照 jQuery.extend

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

这里实际发生的是 jQuery 正在使用test对象的内容创建一个新对象,并记录它(因此它不会改变)。

AngularJS(一)具体解决方案:

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

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