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

pic*_*cer 12 javascript properties node.js console.log

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

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

这是一个例子:

var bson = require("bson");
console.log("bson as %%j: %j", bson);
console.log("bson as console.log: ", bson);
Run Code Online (Sandbox Code Playgroud)

这是输出:

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,
...
Run Code Online (Sandbox Code Playgroud)

我认为既然x.key是相同的x["key"],这意味着属性和字典键在JS中是"相同的东西".我尝试这之后发现BSON.BSONPure{},但BSON.BSONPure.BSONBSON.BSONPure["BSON"]是一个function对象!

这让我相信无论如何"%j",必须以某种方式排除某些键.它如何决定排除哪些键?为什么会这样呢?有时JS是一种非常混乱的语言!

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

Per*_* P. 24

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

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

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

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

因此,您所看到的行为是完全可以预期的,您正在尝试记录某些JSON无效的行为JSON.

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

> JSON.stringify({func: function(){}}) 
> "{}"
Run Code Online (Sandbox Code Playgroud)

  • 我想这是有道理的.当我打印出一些对象时,我尝试做`console.log("x is"+ x)`这给了无用的`x是[object Object]`.所以我用Google搜索了如何在JS中打印出来的东西,我看到的答案告诉我使用%j,这对于特定的例子有效.但后来我开始使用%j作为"Python的repr()的JS版本"而没有真正阅读它的作用.感谢您参考文档 (2认同)