【问题标题】:What does 'symbol-keyed' mean in `JSON.stringify`“JSON.stringify”中的“符号键控”是什么意思
【发布时间】:2014-10-02 17:37:14
【问题描述】:

有一个Node.js生成的Object,我用console.log的时候是这样的:

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

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

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

我查了mozilla开发者中心,发现this

所有symbol-keyed属性都将被完全忽略,即使在使用替换功能时也是如此。

我认为 'dataValues' 必须是 'symbol-keyed' 属性,但 'symbol-keyed' 是什么意思?

顺便说一句,我使用sequelizejs ORM 库来生成这个对象。

【问题讨论】:

  • "{ 'a': 1, 'b': 1}" 是无效的 JSON。我看不出JSON.stringify 是如何产生的。你是怎么用的?
  • 对不起,字符串错误,我已经修改为正确的格式。
  • @TomWan:如果你在引用的内容上使用JSON.stringify,你不会得到{"a":1,"b":1},你会得到{"dataValues":{"a":1,"b":2}};证明:jsbin.com/ralova/1
  • 我写了 3 年的 JavaScript,我知道在浏览器中是不可能的,它发生在 NodeJS 中,你可以用 NodeJS 和 SequelizeJS 编写一些代码并从 MySQL 中获取一些数据,看看它是如何通过 Promise 返回的.

标签: javascript stringify sequelize.js


【解决方案1】:

我终于在同一个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}

【讨论】:

    【解决方案2】:

    不,与您的问题相关的部分是这个简介:

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

    也就是说,如果您的 JSON 对象包含函数,它们会在 JSON.stringify 过程中被忽略。

    "symbol-keyed" 指的是 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

    【讨论】:

    • 这并不能解释为什么结果中缺少dataValues
    • 我在调试器中编写了未定义的符号,并且“obj.dataValues 的类型”是对象,而不是数组或符号,我使用 NodeJS 0.10.x
    猜你喜欢
    • 2010-09-29
    • 2011-04-18
    • 1970-01-01
    • 2011-04-07
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2014-09-14
    相关资源
    最近更新 更多