Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么JSON.stringify返回空对象表示法";{};对于似乎具有属性的对象?_Javascript_Json_Text To Speech_Stringify - Fatal编程技术网

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”)
等来判断。如果这是真的,那就是“自有”财产;如果不是,它是遗传的。