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

Posted

技术标签:

【中文标题】打印对象时,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 如何确定要打印的属性?的主要内容,如果未能解决你的问题,请参考以下文章

vue中用console.log打印对象的各个属性值

console.llog 如何打印对象

即使它打印在 console.log 中,我也无法映射对象数组

console对象常用的打印方法

引用对象的 console.log 没有打印出我所期望的 [重复]

使用console.log打印的内容不一定可信