什么是'符号键入'意味着JSON.stringify'

时间:2014-08-09 09:22:34

标签: javascript stringify sequelize.js

NodeJS生成了一个Object,当我使用console.log时,它看起来像这样:

{ dataValues: { a: 1, b: 2 }, fn1: function(){}, fn2: function(){} }

当我使用JSON.stringify时,它返回此字符串:

{"a":1,"b":1}

我检查了mozilla开发人员中心并找到了this

  

即使使用了兑换器功能,也会完全忽略所有符号键入属性。

我认为' dataValues'必须是'符号键控'财产,但是'符号键入'意思?

不过,我使用sequelizejs ORM lib来生成这个对象。

2 个答案:

答案 0 :(得分:3)

我终于找到了相同page

的原因
  

如果正在进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON方法自定义JSON字符串化行为:而不是被序列化的对象,调用时toJSON方法返回的值将被序列化。

它通常在浏览器上运行。     这是jsfiddle像我问的那样运行它。

代码:

function test(data) {
    for(var key in data){
        this[key] = data[key];
    }
}

test.prototype.toJSON = function(){
    return this.dataValues;
}

var a = new test({dataValues: {a:1, b:2}});

console.log(a);//the instance
console.log(JSON.stringify(a));//{"a":1,"b":1}

答案 1 :(得分:0)

不,你的问题的相关部分是这个模糊:

  

如果未定义,则在转换过程中遇到函数或符号   它被省略(当它在一个对象中找到时)或被删除   null(当它在数组中找到时)。

换句话说,如果您的JSON对象包含函数,则在JSON.stringify过程中将省略它们。

"符号键控"是指ecmascript6中引入的新原始类型。有关详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof

这是"符号键控的示例"属性:

{[Symbol("foo")]: "foo"}

JavaScript符号参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol