2014-10-08 10 views
5

Stavo recentemente cercando di caricare il modulo bson (binario JSON) in node.js. I documenti API non erano chiari, quindi ho pensato che l'ispezione degli oggetti mi avrebbe aiutato. I risultati dell'ispezione erano sconcertanti.% j specificatore in console.log esclude alcune proprietà

Finalmente ho scoperto che era perché stavo usando %j che "mente" - non stampa tutte le chiavi del dizionario di un oggetto! (Sto usando la terminologia Python per "attributi" come cose a cui si fa riferimento con un punto, e "chiavi del dizionario" per cose a cui si fa riferimento con parentesi, perché non conosco i nomi propri di queste cose in JS.)

Qui è un esempio:

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

ed ecco l'output:

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

ho pensato fin x.key è lo stesso x["key"], che questo significa attributi e le chiavi del dizionario sono "la stessa cosa" in JS. Ho trovato dopo aver sperimentato che BSON.BSONPure è {}, tuttavia BSON.BSONPure.BSON e BSON.BSONPure["BSON"] sono un oggetto function!

Questo mi porta a credere che qualunque cosa sia "%j", deve in qualche modo escludere alcune chiavi. Come decide quali chiavi escludere? Perché dovrebbe farlo? JS è un linguaggio davvero confusionario a volte!

biglietto Github correlati: https://github.com/mongodb/js-bson/issues/97

+0

Entrambe le cose sono le stesse (come si dice, 'x.key' e' x ["chiave"] 'sono totalmente equivalenti) e sono chiamate * proprietà *. – Bergi

risposta

14

Giù nella node.jssource, i risultati %j segnaposto in una chiamata al JSON.stringify() sul argomento passato.

Il fatto è che, passando la variabile bson, non si passa un oggetto valido JSON. Stai passando un modulo node.js che tra le altre cose ha esportato le funzioni.

Quindi, cosa succede quando JSON.stringify() colpisce una funzione?

Se non è definito, si incontra una funzione o un simbolo durante la conversione si sia omesso (quando si trova in un oggetto) o censurato per nulla (quando si trova in un array). (MDN)

Così il comportamento che state vedendo è completamente previsto, si sta cercando di accedere qualcosa come JSON che non è valida JSON.

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

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

Immagino che questo abbia senso. Quando ho stampato un oggetto, ho provato a fare 'console.log (" x è "+ x)' che ha fornito il 'x non utile [oggetto oggetto]'. Così ho cercato su Google come stampare elementi in JS, e la risposta che ho guardato mi ha detto di usare% j, che ha funzionato per l'esempio particolare. Ma poi ho iniziato a usare% j come "la versione JS di Python's repr()" senza realmente leggere quello che fa. Grazie per il riferimento ai documenti – picomancer