JSON.stringify和Object.keys在同一对象上产生不同的结果

时间:2016-05-13 23:43:00

标签: javascript json object

我有一个对我没有任何意义的问题。我想知道你们中是否有人可以提供帮助。

我有一个数据源对象,我用它来访问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和Objects.keys会产生不同的结果。我不明白应该信任哪些来调试我正在使用的代码,或者可能在幕后发生的事情使这两个函数对我编写的代码不一致。

2 个答案:

答案 0 :(得分: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 :(得分:0)

  

键值为" post_get"而值是一个函数

JSON.stringify()不包含引用功能的属性。 Object.keys()会。它就这么简单。