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

时间:2014-10-08 20:51:01

标签: javascript node.js properties console.log

我最近尝试在bson中加载node.js(二进制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

1 个答案:

答案 0 :(得分:21)

node.js source中,%j占位符导致对传递的参数调用JSON.stringify()

问题是,在传递bson变量时,您没有传递有效的JSON对象。您正在传递一个node.js模块,该模块除其他外还有导出的函数。

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

  

如果未定义,则在转换期间会遇到函数或符号   它被省略(当它在一个对象中找到时)或被删除   null(当在数组中找到它时)。 (MDN

因此,您所看到的行为是完全可以预期的,您尝试将某些内容记录为无效JSON的{​​{1}}。

JSON