为什么 JSON.stringify return 空对象符号“{}”对于一个似乎有属性的对象?

Why does JSON.stringify return empty object notation "{}" for an object that seems to have properties?

以下示例显示 JSON.stringify() return 是 SpeechSynthesisVoice 对象的字符串 "{}"

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

完整示例:JSFiddle

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

请注意,上述示例不适用于 chrome 或 iOS;它针对 Mozilla Firefox。

JSON.stringify 包含对象的 自己的可枚举 属性 (spec),这些属性的值不是函数或 undefined(如JSON 没有这些),省略了它从其原型继承的那些,任何定义为不可枚举的,以及任何其值为函数引用或 undefined.

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

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

var voiceObject = window.speechSynthesis.getVoices()[0];
var newvoiceObject = $.extend(newvoiceObject,voiceObject);
JSON.stringify(newvoiceObject); //returns correct JSON string

...但请记住,如果您要求对象属于特定类型,则对象类型会发生变化。

T.J Crowder 的回答对我有用,我是这样创建我的对象的:

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

我改了这个,问题解决了:

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