diff options
Diffstat (limited to 'files/ru/web/javascript/reference/errors/cyclic_object_value')
| -rw-r--r-- | files/ru/web/javascript/reference/errors/cyclic_object_value/index.html | 70 |
1 files changed, 70 insertions, 0 deletions
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 +--- +<div>{{jsSidebar("Errors")}}</div> + +<h2 id="Сообщения">Сообщения</h2> + +<pre class="syntaxbox notranslate">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 notranslate">var circularReference = {otherData: 123}; +circularReference.myself = circularReference; +</pre> + +<p>{{jsxref("JSON.stringify()")}} закончится неудачей</p> + +<pre class="brush: js example-bad notranslate">JSON.stringify(circularReference); +// TypeError: циклическое значение объекта +</pre> + + + +<p>Для сериализации циклических ссылок можно использовать библиотеку, которая их поддерживает (например, cycle.js) или самостоятельно реализовать решение, которое потребует поиска и замены (или удаления) циклических ссылок сериализуемыми значениями.</p> + +<p>Во фрагменте кода ниже показано, как найти и отфильтровать циклическую ссылку (что приводит к потере данных) с помощью параметра <code>replacer</code>{{jsxref("JSON.stringify()")}}:</p> + + + +<pre class="brush: js notranslate">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> |
