This page was translated from English by the community.Learn more and join the MDN Web Docs community.
TypeError: cyclic object value
Сообщения
TypeError: циклическое значение объекта (Firefox)TypeError: преобразование круговой структуры в JSON (Chrome и Opera)TypeError: циклическая ссылка в аргументе значения не поддерживается (Edge)
In this article
Тип ошибки?
TypeErrorЧто не так?
Сам по себеJSON-формат не поддерживает ссылки на объекты (не смотря на то что существуетIETF, который позволяет значению JSON ссылаться на другое значение в JSON-документе), поэтомуJSON.stringify() не пытаеться их анализировать и терпит неудачу при попытке сделать это.
Примеры
В круговой структуре как эта
var circularReference = { otherData: 123 };circularReference.myself = circularReference;JSON.stringify() закончится неудачей
JSON.stringify(circularReference);// TypeError: циклическое значение объектаДля сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.
Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметраreplacerJSON.stringify():
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.stringify- cycle.js – вводит две функции, JSON.decycle и JSON.retrocycle, что даёт возможность кодирования и декодирования циклических структур и групп обеспечения доступности баз данных в расширенный и обратно совместимый формат JSON.