【占坑】关于console.log不能展开对象属性的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【占坑】关于console.log不能展开对象属性的问题相关的知识,希望对你有一定的参考价值。

参考技术A 在chrome前端调试过程中,经常会出现这样的情况:如果你打印的是一个数组,并且里面有多个属性,此时属性需要你一个一个点开才能看见,极大的阻碍了生产力的进步。

有什么方法可以解决这样的问题呢?

此时的显示情况就完全展开了。

打印对象时,console.log 如何确定要打印的属性?

【中文标题】打印对象时,console.log 如何确定要打印的属性?【英文标题】:How does console.log determines what properties to print when printing an object? 【发布时间】:2019-05-04 21:21:15 【问题描述】:

我有一个 mongodb 数据库,我正在使用 mongoose 和 nodejs。当我控制台一个 mongoose 对象时,我得到了我在我的模式中定义的常用键。

console.log(mongooseObject); 
/*
 
  _id: 5b8b7d627defb42e3f6349ef,
  name: 'John Doe',

*/

但是当我尝试使用 Object.keys() 来控制它的键时,它会打印 5 个键,这些键并不是我的架构的一部分,并且必须由 mongoose 在内部用于各种操作。

console.log(Object.keys(mongooseObject)) // [ '$__', 'isNew', 'errors', '_doc', '$init' ]

我的问题是,console.log 如何确定要打印的对象的哪一部分?当直接记录对象时,它如何通过这些键和它们的值来确定要打印的内容?

是否有一个类定义的类似 toString() 的函数来描述对象的 JSON 表示?然后由 console.log 用来实际打印的东西。

编辑:我收到很多与猫鼬相关的解决方案,建议我使用 .toJSON() 和 .toObject()。也许我应该明确表示我并不是真的在寻找与猫鼬相关的东西。我只是使用它的例子,因为这就是我注意到这种特殊行为的方式。我只是一般对 javascript 在这里的工作方式感兴趣。我可以编写一个类来描述如何控制从它实例化的对象吗?

【问题讨论】:

据我所知 javascript 行为,“mongooseObject”可能有一个自定义的 toString 函数。 【参考方案1】:

Mongoose Object 是一个非常复杂的对象,里面有很多功能。 如果您只想将对象转换为纯 mongo json 文档可以使用toJSON() 函数,那么您可以轻松使用.keys

 console.log(Object.keys(mongooseObject.toJSON()))

【讨论】:

【参考方案2】:

我不认为这是控制台打印的键与当时对象中的键不同。您第一次正确打印反对的原因是因为您传递的对象 console.log 在您查看它的那一刻被读取,但是如果您要记录 JSON.parse(JSON.stringify(mongooseObject)) 您可能会意识到该对象当时是空的

Object.keys 返回不同结果的原因是,它会在调用该对象的那一刻用该对象中的键创建一个数组。

理想情况下,您只需等待对象实际存在,然后再打印其键。为了帮助您解决这个问题,我们需要更多代码。

对象会产生这种行为,因为它们是通过引用传递的,请阅读 this*** 帖子以获取有关其含义的优秀信息。

【讨论】:

【参考方案3】:

它可以打印任何它想要的东西。

console.log 实际上不是 Ecmascript 语言标准的一部分。虽然有 WhatWG standard for the console API,但根本不需要 JavaScript 实现来实现它(尽管 AFAIK 都这样做),即使在那个标准部分中,也是明确实现定义的。

所以简短的回答是没有答案。更长的答案是它几乎肯定会打印密钥,可能是内部插槽,如[[class]] 等,但这将很大程度上取决于您传入的实际对象。

【讨论】:

以上是关于【占坑】关于console.log不能展开对象属性的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于console.log

为啥我不能在 chrome 控制台中展开这个事件对象?

关于js对象中的,属性的增删改查问题

数组拓展方法

数组拓展方法

如何 console.log() 一个 Blob 对象?