Javascript 为什么JSON.stringify返回空对象表示法";{};对于似乎具有属性的对象?
以下示例显示Javascript 为什么JSON.stringify返回空对象表示法";{};对于似乎具有属性的对象?,javascript,json,text-to-speech,stringify,Javascript,Json,Text To Speech,Stringify,以下示例显示JSON.stringify()为SpeechSynthesisVoice对象返回字符串“{}”: var voiceObject = window.speechSynthesis.getVoices()[0]; JSON.stringify(voiceObject); //returns "{}"? 完整示例: 为什么它返回“{}”,而不是像“{voiceURI:“Google Deutsch”,name:“Google Deutsch”,lang:“de de”,localSe
JSON.stringify()
为SpeechSynthesisVoice对象返回字符串“{}”
:
var voiceObject = window.speechSynthesis.getVoices()[0];
JSON.stringify(voiceObject); //returns "{}"?
完整示例:
为什么它返回“{}”
,而不是像“{voiceURI:“Google Deutsch”,name:“Google Deutsch”,lang:“de de”,localService:false,default:false}”
请注意,上述示例不适用于chrome或iOS;它是针对Mozilla Firefox的。
JSON。stringify
包括对象自己的可枚举属性(),这些属性的值不是函数或未定义的值(因为JSON没有这些值),而不包括它从原型继承的、任何定义为不可枚举的值,以及其值为函数引用或未定义的任何函数
显然,从
getVoices()[0]
返回的对象没有自己的可枚举属性,可以用JSON表示。它们的所有属性都必须是继承的、定义为不可枚举的,或者(尽管这里可能不是这种情况)函数或未定义的
您可以通过执行以下操作来解决此问题:
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数据类型,尽管这可能与问题的示例无关。好的,谢谢!我已经更新了示例,以显示voice对象似乎具有一些与普通对象类似的属性。您如何(使用调试视图或从控制台输出)看到这些属性是继承的?@mathias:When
.hasOwnProperty()
返回false@MathiasS:这取决于您正在使用的调试器如何显示继承的属性。通常,它们显示为位于名为\uu proto\uu
的对象上的属性上,或者仅显示为proto
。正如slebetman所说,在代码中,您可以通过使用voiceObject.hasOwnProperty(“voiceURI”)
等来判断。如果这是真的,那就是“自有”财产;如果不是,它是遗传的。