首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让console.log显示对象的当前状态?

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

Stack Overflow用户
提问于 2011-09-12 21:57:57
回答 11查看 100.5K关注 0票数 153

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

我必须克隆该对象,以便通过console.log输出该对象,以获得该行对象的状态。

示例:

var test = {a: true}
console.log(test); // {a: false}
test.a = false; 
console.log(test); // {a: false}
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-09-12 22:06:20

我想你是在找console.dir()吧。

调用对象时,console.dir会打印对象中的属性目录。

下面的JSON想法很好;您甚至可以继续解析JSON字符串,并获得一个可浏览的对象,就像.dir()所提供的那样:

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

票数 176
EN

Stack Overflow用户

发布于 2011-09-12 22:10:55

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

console.log(JSON.stringify(a));
票数 72
EN

Stack Overflow用户

发布于 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})

票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7389069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档