--- title: 'TypeError: cyclic object value(TypeError: циклическое значение объекта)' slug: Web/JavaScript/Reference/Errors/Cyclic_object_value tags: - Ошибка - Ошибки translation_of: Web/JavaScript/Reference/Errors/Cyclic_object_value ---
{{jsSidebar("Errors")}}

Сообщения

TypeError: циклическое значение объекта (Firefox)
TypeError: преобразование круговой структуры в JSON (Chrome и Opera)
TypeError: циклическая ссылка в аргументе значения не поддерживается (Edge)

Тип ошибки?

{{jsxref("TypeError")}}

Что не так?

The JSON format per se doesn't support object references (although an IETF draft exists), hence {{jsxref("JSON.stringify()")}} doesn't try to solve them and fail accordingly.

Примеры

В круговой структуре как эта

var circularReference = {otherData: 123};
circularReference.myself = circularReference;

{{jsxref("JSON.stringify()")}} закончится неудачей

JSON.stringify(circularReference);
// TypeError: циклическое значение объекта

Для сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.

Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметра replacer{{jsxref("JSON.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}

Смотрите также