JavaScript 深度克隆和淺度克隆

淺度克隆

淺度克隆實際上就是深度克隆第一維變量, 其他維度的變量不進行特殊處理, 當(dāng)克隆出來的對象中有引用類型的屬性, 那么原對象和克隆對象將使用同一個引用值

const obj = {
  a: 100,
  b: [10, 20, 30],
  c: {
    x: 10
  },
  d: /^\d+$/,
  e: function () {
    console.log(this)
  }
}

function clone(obj) {
  if (obj instanceof RegExp) return new RegExp(obj)
  if (obj instanceof Date) return new Date(obj)
  if (typeof obj === 'function') return new Function('return ' + obj)()
  if (obj === null || typeof obj !== 'object') return obj
  const newObj = new obj.constructor()
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key]
    }
  }
  return newObj
}

const newObj = clone(obj)
newObj.c.x = 1000
console.log(obj.c.x) // 1000

深度克隆

深度克隆即克隆出一個值完全與原對象一致的全新對象, 每一個維度都進行深度克隆, 不論改變原對象還是克隆對象, 都不會對對方造成任何影響

深度拷貝的過程中利用遞歸回溯的特點構(gòu)造一個全新的對象

const obj = {
  a: 100,
  b: [10, 20, 30],
  c: {
    x: 10
  },
  d: /^\d+$/,
  e: function () {
    console.log(this)
  }
}

function deepClone(obj) {
  if (obj instanceof RegExp) return new RegExp(obj)
  if (obj instanceof Date) return new Date(obj)
  if (typeof obj === 'function') return new Function('return ' + obj)()
  if (obj === null || typeof obj !== 'object') return obj
  const newObj = new obj.constructor()
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key])
    }
  }
  return newObj
}

const newObj = deepClone(obj)
newObj.c.x = 1000
console.log(obj.c.x) // 10

封裝

const obj = {
  a: 100,
  b: [10, 20, 30],
  c: {
    x: 10
  },
  d: /^\d+$/,
  e: function () {
    console.log(this)
  }
}

function clone(obj) {
  const isDeepClone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false
  if (obj instanceof RegExp) return new RegExp(obj)
  if (obj instanceof Date) return new Date(obj)
  if (typeof obj === 'function') return new Function('return ' + obj)()
  if (obj === null || typeof obj !== 'object') return obj
  const newObj = new obj.constructor()
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = isDeepClone ? clone(obj[key], isDeepClone) : obj[key]
    }
  }
  return newObj
}

const newObj1 = clone(obj)  // 淺度克隆
const newObj2 = clone(obj, true)  // 深度克隆
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欧宜,一起剝皮案震驚了整個濱河市手趣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌空幻,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翁潘,死亡現(xiàn)場離奇詭異蛹疯,居然都是意外死亡荸镊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門阅束,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呼胚,“玉大人,你說我怎么就攤上這事息裸∮” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵呼盆,是天一觀的道長簿寂。 經(jīng)常有香客問我,道長宿亡,這世上最難降的妖魔是什么常遂? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮挽荠,結(jié)果婚禮上克胳,老公的妹妹穿的比我還像新娘。我一直安慰自己圈匆,他們只是感情好漠另,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跃赚,像睡著了一般笆搓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纬傲,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天满败,我揣著相機與錄音,去河邊找鬼叹括。 笑死算墨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汁雷。 我是一名探鬼主播净嘀,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼报咳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挖藏?” 一聲冷哼從身側(cè)響起暑刃,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎膜眠,沒想到半個月后岩臣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柴底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年婿脸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柄驻。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡狐树,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸿脓,到底是詐尸還是另有隱情抑钟,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布野哭,位于F島的核電站在塔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拨黔。R本人自食惡果不足惜蛔溃,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望篱蝇。 院中可真熱鬧贺待,春花似錦、人聲如沸零截。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涧衙。三九已至哪工,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弧哎,已是汗流浹背雁比。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留傻铣,地道東北人章贞。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像非洲,于是被迫代替她去往敵國和親鸭限。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 如果只想看js两踏,直接從JavaScript標(biāo)題開始败京。 在C#里面,深度clone有System.ICloneabl...
    zhoulujun閱讀 340評論 0 0
  • 最近在復(fù)習(xí)梦染,發(fā)現(xiàn)前端好多知識點牽一發(fā)動全身赡麦。比如我想看一下JQuery的extend源碼,就不得不再好好看看深克隆...
    二璇妹妹閱讀 1,578評論 2 9
  • 一:為什么要實現(xiàn)深度克屡潦丁泛粹? 這是一個前端面試經(jīng)常問到的問題,并且在知乎上我看到很多的前端大神也都探討過肮疗。這個問題背...
    指尖的宇宙閱讀 19,526評論 0 24
  • 聽到這個名字的時候都被嚇尿了晶姊。克隆聽起來就很屌的樣子伪货。不過其實琢磨了一下根本沒有什么好尿的——我特別討厭一些人故作...
    蚊子爸爸閱讀 12,431評論 12 30
  • 要進行深度克隆们衙,首先就需要知道進行克隆的這個變量是什么類型的值,知道了是什么類型的碱呼,我們才能分門別類的去根本不同的...
    無缺啊閱讀 319評論 0 0