diff --git a/files/zh-cn/web/api/web_workers_api/structured_clone_algorithm/index.md b/files/zh-cn/web/api/web_workers_api/structured_clone_algorithm/index.md index 442e057dd12db..756315111919a 100644 --- a/files/zh-cn/web/api/web_workers_api/structured_clone_algorithm/index.md +++ b/files/zh-cn/web/api/web_workers_api/structured_clone_algorithm/index.md @@ -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` 异常。 - 对象的某些特定参数也不会被保留 @@ -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)