结构化克隆
- 结构化克隆是由 HTML5 规范定义的用于复制复杂 JavaScript 对象的算法,例如 structuredClone()函数的调用,Workers的postMessage()方法或使用IndexedDB存储对象时在内部的调用。
- DOM节点,- Function对象不能被结构化克隆算法复制,否则会抛出- DATA_CLONE_ERR的异常。
- RegExp对象的- lastIndex字段,原形链上的属性(例如,一个类的实例会被复制为一个普通对象),属性描述符(例如,如果一个对象用属性描述符标记为- read-only,它将会被复制为- read-write,因为这是默认的情况。),- getters和- setters以及其他类似元数据的功能不会被保留。
- 支持的类型:- symbols除外的所有原始类型。
- Boolean- String原始类型包装对象。
- Array- Map- Set- Date- RegExp内置对象。
- Blob- File- FileList文件类型对象。
- ArrayBuffer- TypedArray- DataView- Buffer类型对象。
- ImageBitmap- ImageData图形对象。
- Object仅包括普通对象,例如对象字面量。
- Error,- EvalError,- RangeError,- ReferenceError,- SyntaxError,- TypeError,- URIError错误类型,其他类型错误- name属性会被转成- Error,- message属性会丢失。
 
序列化
- 序列化指将对象或数据结构转换为适合通过网络或存储(例如,数组缓冲区或文件格式)传输的格式的过程。例如通过 JSON.stringify()将对象序列化为JSON字符串,通过CSSStyleDeclaration.getPropertyValue函数将CSS值序列化为字符串document.styleSheets[0].cssRules[0].style.getPropertyValue('margin')。
- 反序列化指将较低级别的格式(例如,已通过网络传输或存储在数据存储中)转换为可读对象或其他数据结构的过程。例如通过 JSON.parse()将JSON字符串反序列化为对象。
- 可序列化对象指可以在 js 作用域中进行序列化和反序列化的对象,所有原始值都是可序列化的,但不是所有对象都是可序列化的。可以序列化的对象包括结构化克隆算法支持的类型。
可传输对象
- 结构化克隆算法使 postMessage()在Worker和主线程之间不再仅仅传输字符串类型,还可以传输包括File,Blob,ArrayBuffer,JSON对象类型。但结构化克隆算法仍然是一种复制操作,例如将 32MB 的ArrayBuffer传递给Worker的开销可能是数百毫秒。
- Transferable接口可以巨大改进消息传递性能。可以将其视为传递引用,但是与传递引用不同,调用上下文中的“版本”一旦传输到新上下文就不再可用,这样能防止多个线程同时修改数据。可传输对象是零拷贝,极大地提高了向- Worker发送数据的性能。
- 类型化数组是可序列化的,但不可传输,但它们的底层缓冲区 buffer属性是一个ArrayBuffer,是一个可传输对象。例如,我们可以在传输数组中发送uInt8Array.buffer,但不能在传输数组中发送uInt8Array。
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 张坤的博客!
 评论