手寫一個深拷貝

  1. 深拷貝和淺拷貝的區(qū)別
    深拷貝和淺拷貝最根本的區(qū)別在于是否真正復(fù)制一個對象的實(shí)體睦尽,而不是引用铁材。舉個爪子,假如 同學(xué)A 抄同學(xué) B 的筆記惫叛,B給A同學(xué)一個復(fù)制鏈接倡勇,B 筆記做了修改,A同學(xué)的筆記也變了 這叫淺拷貝嘉涌,
    如果 A抄同學(xué)的筆記妻熊,又獨(dú)立建了一份新的,互不影響仑最,這是是你拷貝
    官方說法
    淺拷貝 只是增加了一個指針指向已存在的內(nèi)存地址扔役,
    深拷貝 是增加了一個指針并且申請了一個新的內(nèi)存,使這個增加的指針指向這個新的內(nèi)存

  2. 淺拷貝的方法
    Object.assgin()
    Array.prototype.slice()
    Array.prototype.concat()
    b=[...a]

  3. 深拷貝

  • JSON.parse(JSON.stringify(obj))
  • 手寫

let obj = {
  name:'hello',
  type:[1,2,3],
  content:{
    title:'nihao'
  }
}
// 手寫深拷貝
// WeakMap跟Map結(jié)構(gòu)類似警医,也擁有g(shù)et亿胸、has、delete等方法预皇,使用法和使用途都一樣侈玄。
// WeakMap只接受對象作為鍵名,但null不能作為鍵名
// WeakMap不支持clear方法吟温,不支持遍歷序仙,也就沒有了keys、values鲁豪、entries潘悼、forEach這4個方法,也沒有屬性size
// WeakMap 鍵名中的引用類型是弱引使用呈昔,
// 假如這個引使用類型的值被垃圾機(jī)制回收了挥等,WeakMap實(shí)例中的對應(yīng)鍵值對也會消失。WeakMap中的key不計入垃圾回收堤尾,即若只有WeakMap中的key對某個對象有引用肝劲,那么此時執(zhí)行垃圾回收時就會回收該對象,而Map中的key是計入垃圾回收

// 判斷類型是不是對象
function checkType(source) {
  // 1種寫法
  return  Object.prototype.toString.call(source).slice(8,-1)
  // 2種寫法
  // return typeof obj === 'object' && obj != null;

}

function copyDeep(source,map = new WeakMap()) {
    // 判斷如果參數(shù)是不是一個對象郭宝,如果不是返回該參數(shù)
  let cloneObj, type = checkType(source)
    if(type =='object'){
      cloneObj = {}
    }else if(type =='Array'){
      cloneObj = []
    }else{
      return source
    }
    // 如果拷貝過該對象辞槐,則直接返回該對象
      if(map.get(source)){
      return source
      }
  // 如果不存在,我們放到map對象里
      map.set(source,cloneObj)
  //遞歸拷貝
  for(key in source){
    cloneObj[key] = copyDeep[source[key],map]
  }
  //最后返回克隆的值
  return cloneObj

}

console.log(copyDeep(obj))

image.png

github 地址 https://github.com/hegegetellstory1/blog-sharing

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘室,一起剝皮案震驚了整個濱河市榄檬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衔统,老刑警劉巖鹿榜,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件海雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡舱殿,警方通過查閱死者的電腦和手機(jī)奥裸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪袭,“玉大人湾宙,你說我怎么就攤上這事「园恚” “怎么了侠鳄?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長死宣。 經(jīng)常有香客問我伟恶,道長,這世上最難降的妖魔是什么毅该? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任知押,我火速辦了婚禮,結(jié)果婚禮上鹃骂,老公的妹妹穿的比我還像新娘。我一直安慰自己罢绽,他們只是感情好畏线,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著良价,像睡著了一般寝殴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上明垢,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天蚣常,我揣著相機(jī)與錄音,去河邊找鬼痊银。 笑死抵蚊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溯革。 我是一名探鬼主播贞绳,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼致稀!你這毒婦竟也來了冈闭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤抖单,失蹤者是張志新(化名)和其女友劉穎萎攒,沒想到半個月后遇八,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耍休,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年刃永,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羹应。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揽碘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出园匹,到底是詐尸還是另有隱情雳刺,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布裸违,位于F島的核電站掖桦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏供汛。R本人自食惡果不足惜枪汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怔昨。 院中可真熱鬧雀久,春花似錦、人聲如沸趁舀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矮烹。三九已至越庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奉狈,已是汗流浹背卤唉。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仁期,地道東北人桑驱。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像跛蛋,于是被迫代替她去往敵國和親碰纬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353