2014-10-08 43 views
5

我最近試圖在node.js中加載bson(二進制JSON)模塊。 API文檔不清楚,所以我認爲檢查對象會對我有所幫助。檢查結果令人困惑。%console.log中的j說明符排除了一些屬性

最後我發現這是因爲我在使用%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.BSONBSON.BSONPure["BSON"]function的對象!

這使我相信,無論"%j"做什麼,必須以某種方式排除某些鍵。它如何決定排除哪些鍵?爲什麼它甚至會這樣做? JS有時候是一種非常混亂的語言!

相關Github上票:在node.jssourcehttps://github.com/mongodb/js-bson/issues/97

+0

兩件事情都是一樣的(正如你所說,'x.key'和'x [「key」]'完全等價),它們被稱爲* properties *。 – Bergi 2014-10-08 22:51:40

回答

14

下,該%j佔位導致在傳遞的參數JSON.stringify()通話。

事情是,在傳遞您的bson變量時,您未傳遞有效的JSON對象。您正在傳遞一個node.js模塊,其中包含導出函數。

那麼,當JSON.stringify()命中一個函數會發生什麼?

如果未定義,函數,或一個符號被轉換 期間遇到它要麼省略(當它在一個對象被發現)或截尾以 空(當在一個陣列中一樣)。 (MDN

所以你看到的行爲是完全預期,你嘗試登錄的東西爲JSON無效JSON

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

> JSON.stringify({func: function(){}}) 
> "{}" 
+1

我想這是有道理的。當我打印出一些對象時,我試着做'console.log(「x is」+ x)''這給了'x is [object Object]無用的''。所以我搜索瞭如何在JS中打印出來,並且我看到的答案告訴我使用%j,這對於特定的示例有效。但是後來我開始使用%j作爲「Python的repr()的JS版本」,而沒有真正閱讀它的功能。感謝您參考文檔 – picomancer 2014-10-11 07:59:33