[JavaScript] 如何實(shí)現(xiàn)對(duì)象的 deep clone

這是上一篇 [JavaScript] 引用 vs 復(fù)制 的后續(xù)。

淺克隆

上一篇中說的 =Object.assign() 包括 ES6 的 spread operator 都是淺克隆,= 只會(huì)對(duì)原對(duì)象進(jìn)行引用,后兩種方法只會(huì)對(duì)對(duì)象的第一層進(jìn)行克隆。

深度克隆

深度克隆指生成一個(gè)獨(dú)立的對(duì)象,和原對(duì)象之間不會(huì)互相影響。

對(duì)一個(gè)對(duì)象深度克隆,完全取決于你所要拷貝的數(shù)據(jù)類型。

let obj = {
    a: 1,
    b: {
        c: 1
    }
}

let obj2 = JSON.parse(JSON.stringify(obj))

上面的例子是可以實(shí)現(xiàn)深度克隆的,但是它的缺陷是只能復(fù)制對(duì)象返回的值,不能對(duì)實(shí)例進(jìn)行復(fù)制。

let obj = {
    name: 'Bob',
    date: {
        now: new Date()
    }
}

let obj2 = JSON.parse(JSON.stringify(obj))

這個(gè)例子中,當(dāng)我們要復(fù)制一個(gè) Date 實(shí)例時(shí),JSON.parse(JSON.stringify(obj)) 只會(huì)先把實(shí)例返回的值轉(zhuǎn)成字符串,然后再轉(zhuǎn)換成對(duì)象,所有 Date 支持的方法和繼承的方法都是沒有被克隆的。最后的結(jié)果 obj2.date.now 只是一個(gè)字符串顯示了你復(fù)制時(shí)的時(shí)間。

通過 NodeJs Serialization API 實(shí)現(xiàn)深度克隆

可以使用 nodejs API 來實(shí)現(xiàn)深度克隆。v8 是 nodejs version 8 新加的庫(kù)。其中包含了 serializedeserialize 方法,實(shí)現(xiàn)深度克隆。

const v8 = require('v8')

let obj = {
    name: 'Bob',
    date: {
        now: new Date()
    }
}

let obj2 = v8.deserialize(serialize(obj))

通過第三方函數(shù)庫(kù)實(shí)現(xiàn)深度克隆

Loadash

const cloneDeep = require('lodash.cloneDeep')

let obj2 = cloneDeep(obj)

類似的函數(shù)庫(kù)還有很多,比如 Underscore,Ramda 都提供了 deep clone 的方法。

原理

Deep clone 并不是完美的,目前大部分方法都是基于結(jié)構(gòu)化克隆算法(The structured clone algorithm)。

算法有局限性,可以通過查閱文檔來判斷是否滿足需求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1大同小異的工作周報(bào) Sunny軟件公司一直使用自行開發(fā)的一套OA (Office Automatic,辦公自動(dòng)化...
    justCode_閱讀 1,246評(píng)論 0 3
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,516評(píng)論 6 13
  • 1 場(chǎng)景問題# 1.1 訂單處理系統(tǒng)## 考慮這樣一個(gè)實(shí)際應(yīng)用:訂單處理系統(tǒng)。 現(xiàn)在有一個(gè)訂單處理的系統(tǒng),里面有個(gè)...
    七寸知架構(gòu)閱讀 4,672評(píng)論 3 63
  • 真想對(duì)自己說一句 這么胖了 還喝奶茶啊 生活最近是瑣瑣碎碎的 一成不變的日子里 人容易忘記時(shí)間的流逝 看到自己設(shè)置...
    Tikey啊閱讀 146評(píng)論 0 0
  • 內(nèi)心充滿陰霾, 我突然想起兒時(shí)的溫暖―― 坐在老房子門口石階上, 始料未及那左前方的初陽(yáng), 那一束束光斜投在我的身...
    眼淚相信快樂閱讀 68評(píng)論 0 0

友情鏈接更多精彩內(nèi)容