为什么 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
}
});
以下示例显示 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
}
});