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.key
与x["key"]
是一样的,这意味着JS中的属性和字典键是“同一件事物”。 我在实验后发现BSON.BSONPure
是{}
,然而BSON.BSONPure.BSON
和BSON.BSONPure["BSON"]
是一个function
对象!
这使我相信,无论"%j"
做什么,都必须排除一些密钥。 它如何决定排除哪些键? 为什么会这样呢? JS有时是一个非常混乱的语言!
相关的Github票证: https : //github.com/mongodb/js-bson/issues/97
在node.js
源代码中 , %j
占位符导致对传入参数的JSON.stringify()
调用。
事情是,在传递你的bson
variables时,你没有传递一个有效的JSON
对象。 您正在传递一个node.js模块,其中包含导出的函数。
那么,当JSON.stringify()
碰到一个函数时会发生什么?
如果未定义,则在转换过程中遇到函数或符号时,会将其忽略(在对象中find该对象时)或将其检查为空(在数组中find它时)。 ( MDN )
所以你所看到的行为是完全可以预料的,你正在尝试将某些东西logging为JSON
,而JSON
是无效的。
> JSON.stringify({name: "Bob"}) > "{"name":"Bob"}" > JSON.stringify({func: function(){}}) > "{}"