2016-05-13 74 views
1

我有一個問題對我沒有任何意義。我想知道你們有沒有人可以幫忙。JSON.stringify和Object.keys在同一個對象上產生不同的結果

我有一個數據源對象,我用它來訪問REST數據。所有複雜的異步工作都能正常工作,但我完全沒有想到將選項傳遞給數據源配置的簡單任務。

目前,我有這樣的功能:

object.addSourceOption = function(model, optKey, optVal){ 
     if(!_.has(config.sources, model)){ return this; } 
     else{ 
      var options = config.sources[model]["options"]; 
      options[optKey] = optVal; 
      console.log(options[optKey]); 
      //options = JSON.parse(JSON.stringify());     
      console.log("Source Option: " + optKey + ": " + optVal 
         +" added for model: " + model); 
      var debugString = JSON.stringify(options); 
      console.log(debugString); 
      console.log(Object.keys(options)); 
     } 
     return this; 
    }; 

這個函數被調用,它的被據我可以看到一個名爲具有良好的價值觀。這裏的一些調試輸出的一個例子(在這種情況下,鍵值爲「post_get」和值是一個函數,並打印):

function (element){ 

    } 
restData2.js:189 Source Option: post_get: function (element){ 

    } added for model: Contacts 
restData2.js:191 {} 
restData2.js:192 ["post_get"] 

我不明白爲什麼JSON.stringify和對象。鍵會產生不同的結果。我不明白要調試我正在使用的代碼,或者可能在幕後發生的事情,以使這兩個函數對我寫的代碼不同意。

回答

1

恭喜!你找到的JSON.stringify(...) :)

微妙的部分之一下面是一個有用的部分來自MDN

如果undefined,函數或符號轉換過程中遇到它要麼省略(當它在一個對象中被發現時)或刪去(當它在數組中被發現時)。 JSON.stringify也可以在傳入「純」值時返回undefined,例如JSON.stringify(function(){})JSON.stringify(undefined)

雖然JSON很方便,因爲它看起來像Javascript,JSON實際上是Javascript的一個子集。而且,並不是所有的JS對象都可以用JSON表示。詳細信息請見http://json.org/

但是,在您的示例中,post_get未顯示在JSON中,因爲類型函數的屬性在JSON中不合法。

希望這會有所幫助!

旁白:

另外,請記住,有時JS對象可以不受任何Object.keys(...)返回的屬性,因爲Object.keys(...)只返回是屬性不從該對象擴展的任何原型(基礎對象)繼承

+1

非常感謝。這是一個非常有用的評論,它絕對幫助我擺脫這個困擾。如果我想到了這一點,功能將會被忽略掉,這很明顯,而且大多數情況下,我們會想要的。但我沒有那麼想。所以謝謝。 – aphenine

+0

@aphenine - 很高興幫助:)。我看到你是Stack Overflow的新手 - 如果你同意這是正確的答案,你應該把它標記爲:)。這將有助於未來的遊客。 –

0

密鑰值爲「post_get」和值是一個函數

JSON.stringify()將不包括引用的功能性質。 Object.keys()會。就這麼簡單。

相關問題