2014-10-08 12 views
5

node.js içinde bson (ikili JSON) modülünü yüklemeye çalışıyordum. API dokümanları açık değildi, bu yüzden objelerin bana yardım edeceğini düşünüyordum. Denetimin sonuçları şaşırtıcıydı.% j belirteci, console.log bazı özelliklerini hariç

Sonunda, "yalan" olan %j kullanıyor olmama neden olduğunu öğrendim - bir nesnenin tüm sözlük anahtarlarını basmıyor! (Ben bir nokta ile başvurulan şeyler için "öznitelikleri" için Python terminolojisini ve parantez içinde atıfta bulunulan şeyler için "sözlük tuşları" kullanıyorum çünkü JS'de bu şeylerin isimlerini bilmiyorum.)

İşte bir örnek: burada

var bson = require("bson"); 
console.log("bson as %%j: %j", bson); 
console.log("bson as console.log: ", bson); 

ve çıkış var: x.key bu nitelikler ve sözlük tuşları JS "aynı şey" demektir ki x["key"] aynı olduğundan

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, 
... 

diye düşündüm. BSON.BSONPure'un {} olduğunu, ancak BSON.BSONPure.BSON ve BSON.BSONPure["BSON"] bir function nesnesi olduğunu deneytikten sonra buldum!

Bu, "%j"'un her neyse, bazı tuşların dışında kalması gerektiğine inanmamı sağlar. Hangi tuşların hariç tutulacağına nasıl karar verilir? Bunu neden yapsın ki? JS bazen kafa karıştırıcı bir dildir!

İlgili Github bilet: node.jssource yılında Aşağı https://github.com/mongodb/js-bson/issues/97

+0

Her iki şey de aynıdır ("x.key" ve "x [" anahtar "]' da tamamen eşdeğerdir) ve bunlara * properties * denir. – Bergi

cevap

14

geçti argüman üzerinde JSON.stringify() bir çağrı %j tutucu sonuçları.

Buradaki bson değişkeninizi geçerken, geçerli bir JSON nesnesini geçmiyorsunuz. Diğer şeylerin yanı sıra fonksiyonları ihraç eden bir node.js modülünü geçiriyorsunuz.

Peki, JSON.stringify() bir işlevi isabet ettiğinde ne olur? tanımlanmamış ise (bir nesnede bulunan olduğunda) ya da (bir dizide bulunduğunda) null sansürlenmiş

, bir fonksiyon ya da bir simge Belirtilmediği ya dönüşüm sırasında da karşılaşılır. Yani görüyoruz davranış tamamen beklenen

(MDN)

, sen JSON geçerli değil JSON olarak bir şeyler oturum açmak için çalışıyoruz.

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

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

Sanırım bu mantıklı. Bir nesneyi yazdırdığımda, "x nesne [nesne]" olan yardımcı olmayan bir dosya verdiğini denedim. Bu yüzden, JS'de bir şeyler nasıl yazdıracağımı araştırdım ve baktığım cevap, bana özel örnek için çalışan% j'yi kullanmamı söyledi. Ama sonra,% j'i, Python'un repr() 'inin JS sürümünü, aslında ne yaptığını okumadan kullanmaya başladım. Dokümanlara yapılan referans için teşekkürler – picomancer