--- title: 'TypeError: cyclic object value' slug: Web/JavaScript/Reference/Errors/Cyclic_object_value tags: - Error - Errors - JavaScript - TypeError translation_of: Web/JavaScript/Reference/Errors/Cyclic_object_value ---
JavaScript の例外 "cyclic object value" は、 JSON の中にオブジェクトの参照が見つかったときに発生します。 {{jsxref("JSON.stringify()")}} はこれを解決しようとせず、これによって失敗します。
TypeError: cyclic object value (Firefox) TypeError: Converting circular structure to JSON (Chrome and Opera) TypeError: Circular reference in value argument not supported (Edge)
{{jsxref("TypeError")}}
JSON 形式はオブジェクト参照に対応していません (IETF の草案はありますが)。したがって {{jsxref("JSON.stringify()")}} はこれを解決しようとせず、これによって失敗します。
次のような循環構造体では、
var circularReference = {otherData: 123}; circularReference.myself = circularReference;
{{jsxref("JSON.stringify()")}} は失敗します。
JSON.stringify(circularReference); // TypeError: cyclic object value
循環参照をシリアライズするには、それに対応したライブラリ (例えば cycle.js) を使用したり、自分自身で循環参照を探してシリアライズ可能な値に置き換える (または削除する) ことを求める解決策を実装することもできます。
次のスニペットは、 {{jsxref("JSON.stringify()")}} の replacer
引数を使用して循環参照を検索してフィルタリングする方法を示しています (これによりデータ損失が発生します)。
const getCircularReplacer = () => { const seen = new WeakSet(); return (key, value) => { if (typeof value === "object" && value !== null) { if (seen.has(value)) { return; } seen.add(value); } return value; }; }; JSON.stringify(circularReference, getCircularReplacer()); // {"otherData":123}
JSON.decycle
と JSON.retrocycle
という 2 つの関数を導入し、循環構造と dag を JSON でエンコードしてからリカバリーできます。