2016-05-13 46 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()会。就这么简单。

相关问题