Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: an error in Chinese version of Structured_clone_algorithm #9598

Merged
merged 3 commits into from
Oct 31, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)