From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../errors/cyclic_object_value/index.html | 70 ++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 files/ru/web/javascript/reference/errors/cyclic_object_value/index.html (limited to 'files/ru/web/javascript/reference/errors/cyclic_object_value') diff --git a/files/ru/web/javascript/reference/errors/cyclic_object_value/index.html b/files/ru/web/javascript/reference/errors/cyclic_object_value/index.html new file mode 100644 index 0000000000..cfbf6eb56c --- /dev/null +++ b/files/ru/web/javascript/reference/errors/cyclic_object_value/index.html @@ -0,0 +1,70 @@ +--- +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}
+
+ +

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

+ + -- cgit v1.2.3-54-g00ecf