最近我尝试在node.js
中加载bson
(二进制JSON)模块。由于API文档不清楚,所以我想检查对象来帮助自己。但检查结果让我感到困惑。
最终我发现问题出在我使用了%j
,它会“欺骗”我——它不会打印对象字典键的所有内容!(在JS中,我使用Python术语表示“属性”指的是用点引用的事物,“字典键”指的是用括号引用的事物,因为我不知道这些事物的正确名称。)
这里是一个例子:
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
x.key
和x["key"]
完全等价),它们被称为属性。 - Bergi