web-dev-qa-db-ja.com

JSON.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では機能しません。MozillaFirefoxを対象としています。

12
Mathias S

_JSON.stringify_には、関数またはundefinedではない値を持つオブジェクトのown、enumerableプロパティ( spec )が含まれます(JSONにはそれらがないため)、プロトタイプから継承するもの、列挙不可能として定義されているもの、および値が関数参照またはundefinedであるものは除外します。

明らかに、getVoices()[0]から返されるオブジェクトには、JSONで表すことができる独自の列挙可能なプロパティがありません。それらのすべてのプロパティは、継承されるか、列挙不可能として定義されるか、(ここではおそらくそうではありませんが)関数またはundefinedのいずれかである必要があります。

15
T.J. Crowder

これを修正するには、次のようにします。

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

...ただし、オブジェクトが特定のタイプである必要がある場合は、オブジェクトタイプが変更されることに注意してください。

0