blob: 246bb98a4c674bbd5cb1e5e220060a77e7049674 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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
---
<div>{{jsSidebar("Errors")}}</div>
<h2 id="Сообщения">Сообщения</h2>
<pre class="syntaxbox">TypeError: циклическое значение объекта (Firefox)
TypeError: преобразование круговой структуры в JSON (Chrome и Opera)
TypeError: циклическая ссылка в аргументе значения не поддерживается (Edge)
</pre>
<h2 id="Тип_ошибки">Тип ошибки?</h2>
<p>{{jsxref("TypeError")}}</p>
<h2 id="Что_не_так">Что не так?</h2>
<p>The <a href="https://www.json.org/">JSON format</a> per se doesn't support object references (although an <a href="http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03">IETF draft exists</a>), hence {{jsxref("JSON.stringify()")}} doesn't try to solve them and fail accordingly.</p>
<h2 id="Примеры">Примеры</h2>
<p>В круговой структуре как эта</p>
<pre class="brush: js">var circularReference = {otherData: 123};
circularReference.myself = circularReference;
</pre>
<p>{{jsxref("JSON.stringify()")}} закончится неудачей</p>
<pre class="brush: js example-bad">JSON.stringify(circularReference);
// TypeError: циклическое значение объекта
</pre>
<p>Для сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.</p>
<p>Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметра <code>replacer</code>{{jsxref("JSON.stringify()")}}:</p>
<pre class="brush: js">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}
</pre>
<h2 id="Смотрите_также">Смотрите также</h2>
<ul>
<li>{{jsxref("JSON.stringify")}}</li>
<li><a href="https://github.com/douglascrockford/JSON-js/blob/master/cycle.js">cycle.js</a> – вводит две функции, JSON.decycle и JSON.retrocycle, что даёт возможность кодирования и декодирования циклических структур и групп обеспечения доступности баз данных в расширенный и обратно совместимый формат JSON.</li>
</ul>
|