JavaScript 深拷貝性能分析(漢化版)
JavaScript 深拷貝性能分析html
Object.assign()
Object.assign 方法只會拷貝源對象自身的而且可枚舉的屬性到目標對象。該方法使用源對象的[[Get]]和目標對象的[[Set]],因此它會調用相關 getter 和 setter。算法
JSON.parse
過去瀏覽器內部傳遞的對象是使用JSON進行序列化的。 現代瀏覽器序列化將使用結構化克隆算法。這將會使更多對象能夠被安全的傳遞。segmentfault
優勢瀏覽器
代碼簡單安全
const obj = /* ... */ const copy = JSON.parse(JSON.stringify(obj))
缺點數據結構
沒法解決處理循環對象, 如當您構建樹狀數據結構,其中一個節點引用其父級,而父級又引用其子級。異步
const x = {}; const y = {x}; x.y = y; // Cycle: x.y.x.y.x.y.x.y.x... const copy = JSON.parse(JSON.stringify(x)); // throws!
Map
, Set
, RegExp
, Date
, ArrayBuffer
和其餘內置類型在進行序列化時會丟失 由於它支持包含循環圖的對象的序列化 ---對象能夠引用在同一個圖中引用其餘對象的對象。此外,在某些狀況下,結構化克隆算法可能比JSON更高效。
結構化算法優於JSON
的地方ide
的克隆粒度將會跟原始對象相同,而且複製出來相同的像素數據。性能
對象的某些特定參數也不會被保留url
Channel Messaging API的Channel Messaging接口容許咱們建立一個新的消息通道,並經過它的兩個MessagePort 屬性發送數據。
消息通道的傳遞是異步的,使用結構化克隆算法。
Note: 此特性在 Web Worker 中可用。
兼容性以下:
HTML5引入了 history.pushState()
和 history.replaceState()
方法,它們分別能夠添加和修改歷史記錄條目。這些方法一般與window.onpopstate
配合使用。
history.pushState(data({a: 'hi'}), name("tdy"), url("bar.html"))
pushState
一致,修改當前頁面的信息state
屬性上pushState或replaceState時須要複製一份狀態對象,這個狀態對象使用結構化克隆並且是同步的。
最大儲存對象大小爲640KB。
Safari 瀏覽器對replaceState調用的限制數量爲 30 秒內 100 次。
兼容性以下:
簡潔明瞭
function structuralClone(obj) { return new Notification('', {data: obj, silent: true}).data } const obj = /* ... */ const clone = structuralClone(obj)
兼容性欠佳,而且,Safari 老是返回undefined。
若是您沒有循環對象,而且不須要保留內置類型,則可使用跨瀏覽器的JSON.parse(JSON.stringify())得到最快的克隆性能。
若是你想要一個適當的結構化克隆,MessageChannel是你惟一可靠的跨瀏覽器的選擇。