@@ -3,11 +3,13 @@ title: 结构化克隆算法
33slug : Web/API/Web_Workers_API/Structured_clone_algorithm
44---
55
6- 结构化克隆算法是[ 由 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 ) 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。
6+ {{DefaultAPISidebar("Web Workers API")}}
7+
8+ ** 结构化克隆算法** 用于复制复杂 JavaScript 对象的算法。通过来自 [ Worker] ( /zh-CN/docs/Web/API/Worker ) 的 ` postMessage() ` 或使用 [ IndexedDB] ( /zh-CN/docs/Glossary/IndexedDB ) 存储对象时在内部使用。它通过递归输入对象来构建克隆,同时保持先前访问过的引用的映射,以避免无限遍历循环。
79
810## 结构化克隆所不能做到的
911
10- - [ ` Error ` ] ( /zh-CN/JavaScript/Reference/Global_Objects/Error ) 以及 [ ` Function ` ] ( /zh-CN /JavaScript/Reference/Global_Objects/Function) 对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 ` DATA_CLONE_ERR ` 的异常。
12+ - [ ` Function ` ] ( /zh-CN/docs/Web /JavaScript/Reference/Global_Objects/Function ) 对象是不能被结构化克隆算法复制的;如果你尝试这样子去做,这会导致抛出 ` DATA_CLONE_ERR ` 的异常。
1113- 企图去克隆 DOM 节点同样会抛出 ` DATA_CLONE_ERR ` 异常。
1214- 对象的某些特定参数也不会被保留
1315
@@ -17,29 +19,36 @@ slug: Web/API/Web_Workers_API/Structured_clone_algorithm
1719
1820## 支持的类型
1921
20- | 对象类型 | 注意 |
21- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
22- | [ 所有的原始类型] ( /zh-CN/docs/Web/JavaScript/Data_structures#原始值 ) | symbols 除外 |
23- | [ Boolean] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean ) 对象 | |
24- | String 对象 | |
25- | [ Date] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date ) | |
26- | [ RegExp] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp ) | ` lastIndex ` 字段不会被保留。 |
27- | {{ domxref("Blob") }} | |
28- | {{ domxref("File") }} | |
29- | {{ domxref("FileList") }} | |
30- | [ ArrayBuffer] ( /zh-CN/docs/Web/API/ArrayBuffer ) | |
31- | [ ArrayBufferView] ( /zh-CN/docs/Web/API/ArrayBufferView ) | 这基本上意味着所有的 [ 类型化数组] ( /zh-CN/docs/Web/JavaScript/Typed_arrays ) ,如 Int32Array 等。 |
32- | {{ domxref("ImageData") }} | |
33- | [ Array] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array ) | |
34- | [ Object] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object ) | 仅包括普通对象(如对象字面量) |
35- | [ Map] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map ) | |
36- | [ Set] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set ) | |
37-
38- ## 相关链接
39-
40- - [ HTML5 Specification: Safe passing of structured data] ( http://www.w3.org/TR/html5/infrastructure.html#safe-passing-of-structured-data )
41- - {{ domxref("window.history") }}
42- - {{ domxref("window.postMessage()") }}
43- - [ Web Workers] ( /zh-CN/docs/Web/API/Web_Workers_API )
22+ ### JavaScript 类型
23+
24+ - {{jsxref("Array")}}
25+ - {{jsxref("ArrayBuffer")}}
26+ - {{jsxref("Boolean")}}
27+ - {{jsxref("DataView")}}
28+ - {{jsxref("Date")}}
29+ - {{jsxref("Error")}} 类型(仅限部分 [ Error 类型] ( #error_类型 ) )。
30+ - {{jsxref("Map")}}
31+ - {{jsxref("Object")}} objects: but only plain objects (e.g. from object literals).
32+ - 除 ` symbol ` 以外的[ 基本类型] ( /zh-CN/docs/Web/JavaScript/Data_structures#primitive_values ) 。
33+ - {{jsxref("RegExp")}}:` lastIndex ` 字段不会被保留。
34+ - {{jsxref("Set")}}
35+ - {{jsxref("String")}}
36+ - {{jsxref("TypedArray")}}
37+
38+ #### Error 类型
39+
40+ 仅支持以下 ` 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 ` 的)。
41+
42+ 浏览器必须序列化 ` name ` 和 ` message ` 字段,其它有意义的字段则可能会序列化,如 ` stack ` 、` cause ` 等。
43+
44+ [ AggregateError] ( /zh-CN/docs/Web/JavaScript/Reference/Global_Objects/AggregateError ) 预计会在 [ whatwg/html #5749 ] ( https://github.com/whatwg/html/pull/5749 ) 被添加到标准中(并且已被部分浏览器所支持)。
45+
46+ ## 参见
47+
48+ - [ HTML 规范:安全地传递结构化数据] ( https://html.spec.whatwg.org/multipage/infrastructure.html#safe-passing-of-structured-data )
49+ - {{Glossary("Transferable objects", "可转移对象")}}
50+ - {{domxref("structuredClone()")}}
51+ - {{domxref("window.history")}}
52+ - {{domxref("window.postMessage()")}}
53+ - [ Web Worker] ( /zh-CN/docs/Web/API/Web_Workers_API )
4454- [ IndexedDB] ( /zh-CN/docs/Web/API/IndexedDB_API )
45- - [ Components.utils.cloneInto] ( /zh-CN/docs/Components.utils.cloneInto )
0 commit comments