为什么JSON.stringify返回空对象表示法" {}"对于似乎有属性的对象?

时间:2016-07-23 13:22:13

标签: javascript json text-to-speech stringify

以下示例显示JSON.stringify()为SpeechSynthesisVoice对象返回字符串"{}"

var voiceObject = window.speechSynthesis.getVoices()[0];
JSON.stringify(voiceObject); //returns "{}"?

完整示例:JSFiddle

为什么它会返回"{}"而不是"{voiceURI: "Google Deutsch", name: "Google Deutsch", lang: "de-DE", localService: false, default: false}"

请注意,上述示例不适用于chrome或iOS;它是Mozilla Firefox的目标。

3 个答案:

答案 0 :(得分:14)

JSON.stringify包含一个对象的拥有的,可枚举的属性(spec),这些属性的值不是函数或undefined(因为JSON没有那些),遗漏了它从原型继承的那些,任何被定义为不可枚举的,以及任何其值是函数引用或undefined的。

很明显,从getVoices()[0]返回的对象没有可以用JSON表示的自己的可枚举属性。它们的所有属性必须是继承的,定义为不可枚举的,或者(尽管可能不是这里的情况)函数或undefined

答案 1 :(得分:0)

您可以通过以下方法解决此问题:

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Custom" = Table.AddColumn(Source, "total-order", (i) => List.Sum(Table.SelectRows(Source, each ([order] = i[order]))[amount]), type number )
in #"Added Custom"

...但是请记住,如果您要求对象是特定类型,则对象类型将会更改。

答案 2 :(得分:0)

T.J Crowder的答案对我有用,我正在创建这样的对象:

Object.defineProperties(completeObj, {
    [attributeName]: {
        value: finalValue
    }
});

我为此进行了更改,问题得以解决:

Object.defineProperties(completeObj, {
    [attributeName]: {
        value: finalValue,
        enumerable: true
    }
});