console.log中的%j说明符排除了一些属性

我最近试图在node.js加载bson (二进制JSON)模块。 API文档不清楚,所以我认为检查对象会帮助我。 检查结果令人困惑。

最后我发现这是因为我正在使用“谎言”的%j它不会打印所有对象的字典键! (我使用Python的术语“属性”作为引用的点,而“字典键”用括号引用的东西,因为我不知道这些东西在JS中的正确名称。

这里是一个例子:

 var bson = require("bson"); console.log("bson as %%j: %j", bson); console.log("bson as console.log: ", bson); 

这里是输出:

 bson as %j: {"BSONPure":{},"BSONNative":{}} bson as console.log: { BSONPure: { Code: [Function: Code], Symbol: [Function: Symbol], BSON: { [Function: BSON] BSON_INT32_MAX: 2147483647, BSON_INT32_MIN: -2147483648, BSON_INT64_MAX: 9223372036854776000, BSON_INT64_MIN: -9223372036854776000, ... 

我以为x.keyx["key"]是一样的,这意味着JS中的属性和字典键是“同一件事物”。 我在实验后发现BSON.BSONPure{} ,然而BSON.BSONPure.BSONBSON.BSONPure["BSON"]是一个function对象!

这使我相信,无论"%j"做什么,都必须排除一些密钥。 它如何决定排除哪些键? 为什么会这样呢? JS有时是一个非常混乱的语言!

相关的Github票证: https : //github.com/mongodb/js-bson/issues/97

node.js 源代码中 , %j占位符导致对传入参数的JSON.stringify()调用。

事情是,在传递你的bsonvariables时,你没有传递一个有效的JSON对象。 您正在传递一个node.js模块,其中包含导出的函数。

那么,当JSON.stringify()碰到一个函数时会发生什么?

如果未定义,则在转换过程中遇到函数或符号时,会将其忽略(在对象中find该对象时)或将其检查为空(在数组中find它时)。 ( MDN )

所以你所看到的行为是完全可以预料的,你正在尝试将某些东西logging为JSON ,而JSON是无效的。

 > JSON.stringify({name: "Bob"}) > "{"name":"Bob"}" > JSON.stringify({func: function(){}}) > "{}"