Skip to content

Commit

Permalink
fix: an error in Chinese version of Structured_clone_algorithm (#9598)
Browse files Browse the repository at this point in the history
* fix: an error in Chinese version of Structured_clone_algorithm

Fix an error in Chinese version of Structured_clone_algorithm

* minor fixes

* add sidebar

Co-authored-by: allo <[email protected]>
  • Loading branch information
xcatliu and yin1999 authored Oct 31, 2022
1 parent 6d4b871 commit 219b1e4
Showing 1 changed file with 36 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ title: 结构化克隆算法
slug: Web/API/Web_Workers_API/Structured_clone_algorithm
---

结构化克隆算法是[由 HTML5 规范定义](http://www.w3.org/html/wg/drafts/html/master/infrastructure.html#safe-passing-of-structured-data)的用于复制复杂 JavaScript 对象的算法。通过来自 [Workers](/zh-CN/docs/Web/API/Worker)`postMessage()` 或使用 [IndexedDB](/zh-CN/docs/Glossary/IndexedDB) 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。
{{DefaultAPISidebar("Web Workers API")}}

**结构化克隆算法**用于复制复杂 JavaScript 对象的算法。通过来自 [Worker](/zh-CN/docs/Web/API/Worker)`postMessage()` 或使用 [IndexedDB](/zh-CN/docs/Glossary/IndexedDB) 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。

## 结构化克隆所不能做到的

- [`Error`](/zh-CN/JavaScript/Reference/Global_Objects/Error) 以及 [`Function`](/zh-CN/JavaScript/Reference/Global_Objects/Function) 对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 `DATA_CLONE_ERR` 的异常。
- [`Function`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function) 对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 `DATA_CLONE_ERR` 的异常。
- 企图去克隆 DOM 节点同样会抛出 `DATA_CLONE_ERR` 异常。
- 对象的某些特定参数也不会被保留

Expand All @@ -17,29 +19,36 @@ slug: Web/API/Web_Workers_API/Structured_clone_algorithm

## 支持的类型

| 对象类型 | 注意 |
| --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| [所有的原始类型](/zh-CN/docs/Web/JavaScript/Data_structures#原始值) | symbols 除外 |
| [Boolean](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean) 对象 | |
| String 对象 | |
| [Date](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date) | |
| [RegExp](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp) | `lastIndex` 字段不会被保留。 |
| {{ domxref("Blob") }} | |
| {{ domxref("File") }} | |
| {{ domxref("FileList") }} | |
| [ArrayBuffer](/zh-CN/docs/Web/API/ArrayBuffer) | |
| [ArrayBufferView](/zh-CN/docs/Web/API/ArrayBufferView) | 这基本上意味着所有的 [类型化数组](/zh-CN/docs/Web/JavaScript/Typed_arrays) ,如 Int32Array 等。 |
| {{ domxref("ImageData") }} | |
| [Array](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array) | |
| [Object](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object) | 仅包括普通对象(如对象字面量) |
| [Map](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map) | |
| [Set](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set) | |

## 相关链接

- [HTML5 Specification: Safe passing of structured data](http://www.w3.org/TR/html5/infrastructure.html#safe-passing-of-structured-data)
- {{ domxref("window.history") }}
- {{ domxref("window.postMessage()") }}
- [Web Workers](/zh-CN/docs/Web/API/Web_Workers_API)
### JavaScript 类型

- {{jsxref("Array")}}
- {{jsxref("ArrayBuffer")}}
- {{jsxref("Boolean")}}
- {{jsxref("DataView")}}
- {{jsxref("Date")}}
- {{jsxref("Error")}} 类型(仅限部分 [Error 类型](#error_类型))。
- {{jsxref("Map")}}
- {{jsxref("Object")}} objects: but only plain objects (e.g. from object literals).
-`symbol` 以外的[基本类型](/zh-CN/docs/Web/JavaScript/Data_structures#primitive_values)
- {{jsxref("RegExp")}}:`lastIndex` 字段不会被保留。
- {{jsxref("Set")}}
- {{jsxref("String")}}
- {{jsxref("TypedArray")}}

#### Error 类型

仅支持以下 `Error` 类型:[Error](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error)[EvalError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/EvalError)[RangeError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RangeError)[ReferenceError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ReferenceError)[SyntaxError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError)[TypeError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypeError)[URIError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/URIError)(或其它会被设置为 `Error` 的)。

浏览器必须序列化 `name``message` 字段,其它有意义的字段则可能会序列化,如 `stack``cause` 等。

[AggregateError](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/AggregateError) 预计会在 [whatwg/html#5749](https://github.com/whatwg/html/pull/5749) 被添加到标准中(并且已被部分浏览器所支持)。

## 参见

- [HTML 规范:安全地传递结构化数据](https://html.spec.whatwg.org/multipage/infrastructure.html#safe-passing-of-structured-data)
- {{Glossary("Transferable objects", "可转移对象")}}
- {{domxref("structuredClone()")}}
- {{domxref("window.history")}}
- {{domxref("window.postMessage()")}}
- [Web Worker](/zh-CN/docs/Web/API/Web_Workers_API)
- [IndexedDB](/zh-CN/docs/Web/API/IndexedDB_API)
- [Components.utils.cloneInto](/zh-CN/docs/Components.utils.cloneInto)

0 comments on commit 219b1e4

Please sign in to comment.