深淺拷貝

深拷貝 & 淺拷貝

  • 淺拷貝:僅僅是復(fù)制了引用屎慢,彼此之間的操作會(huì)互相影響
  • 深拷貝:在堆中重新分配內(nèi)存瞭稼,不同的地址,相同的值腻惠,互不影響

總的來(lái)說(shuō)环肘,深淺拷貝的主要區(qū)別就是:復(fù)制的是引用還是復(fù)制的是實(shí)例

深淺拷貝的實(shí)現(xiàn)

看一看原生JavaScript中提供的一些復(fù)制方法究竟是深拷貝還是淺拷貝以及動(dòng)手實(shí)現(xiàn)深拷貝。

淺拷貝

  • Array.prototype.slice()
let a = [1, 2, 3, 4];
let b = a.slice();
console.log(a === b); // -> false

a[0] = 5;
console.log(a); // -> [5, 2, 3, 4]
console.log(b); // -> [1, 2, 3, 4]
  • Array.prototype.concat()
let a = [1, 2, 3, 4];
let b = a.concat();
console.log(a === b); // -> false

a[0] = 5;
console.log(a); // -> [5, 2, 3, 4]
console.log(b); // -> [1, 2, 3, 4]

看起來(lái)Array的slice(),concat()似乎是深拷貝集灌,再接著看就知道它們究竟是深拷貝還是淺拷貝:

let a = [[1, 2], 3, 4];
let b = a.slice();
console.log(a === b); // -> false

a[0][0] = 0;
console.log(a); // -> [[0, 2], 3, 4]
console.log(b); // -> [[0, 2], 3, 4]

image.png

同樣廷臼,對(duì)于concat()也進(jìn)行驗(yàn)證:

let a = [[1, 2], 3, 4];
let b = a.concat();
console.log(a === b); // -> false

a[0][0] = 0;
console.log(a); // -> [[0, 2], 3, 4]
console.log(b); // -> [[0, 2], 3, 4]
復(fù)制代碼

綜上, Array的slice和concat方法并不是真正的深拷貝绝页,對(duì)于Array的第一層的元素是深拷貝荠商,而Array的第二層 slice和concat方法是復(fù)制引用。所以续誉,Array的slice和concat方法都是淺拷貝莱没。

深拷貝

  • JSON.parse()和JSON.stringify()
  1. JSON.stringify():把一個(gè)js對(duì)象序列化為一個(gè)JSON字符串
  2. JSON.parse():把JSON字符串反序列化為一個(gè)js對(duì)象
let obj = {
  name: 'leeper',
  age: 20,
  friend: {
    name: 'lee',
    age: 19
  }
};
let copyObj = JSON.parse(JSON.stringify(obj));
obj.name = 'Sandman';
obj.friend.name = 'Jerry';
console.log(obj);
// -> {name: "Sandman", age: 20, friend: {age: 19,name: 'Jerry'}}
console.log(copyObj);
// -> {name: "leeper", age: 20, friend: {age: 19,name: 'lee'}}

image.png

綜上,JSON.parse()和JSON.stringify()是完全的深拷貝酷鸦。

  • 動(dòng)手實(shí)現(xiàn)深拷貝 利用遞歸來(lái)實(shí)現(xiàn)對(duì)對(duì)象或數(shù)組的深拷貝饰躲。遞歸思路:對(duì)屬性中所有引用類型的值進(jìn)行遍歷,直到是基本類型值為止臼隔。
function deepCopy(obj) {
  if (!obj && typeof obj !== 'object') {
    throw new Error('error arguments');
  }
  // const targetObj = obj.constructor === Array ? [] : {};
  const targetObj = Array.isArray(obj) ? [] : {};
  for (let key in obj) {

    //只對(duì)對(duì)象自有屬性進(jìn)行拷貝
    if (obj.hasOwnProperty(key)) {
      if (obj[key] && typeof obj[key] === 'object') {
        targetObj[key] = deepCopy(obj[key]);
      } else {
        targetObj[key] = obj[key];
      }
    }
  }
  return targetObj;
}

鏈接:https://juejin.im/post/6844903608010407944

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘹裂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摔握,更是在濱河造成了極大的恐慌寄狼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異泊愧,居然都是意外死亡伊磺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門删咱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屑埋,“玉大人,你說(shuō)我怎么就攤上這事痰滋≌埽” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵敲街,是天一觀的道長(zhǎng)徊哑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)聪富,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任著蟹,我火速辦了婚禮墩蔓,結(jié)果婚禮上陕赃,老公的妹妹穿的比我還像新娘跨跨。我一直安慰自己缩搅,他們只是感情好晋柱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布芦鳍。 她就那樣靜靜地躺著更哄,像睡著了一般闪萄。 火紅的嫁衣襯著肌膚如雪誊涯。 梳的紋絲不亂的頭發(fā)上洪鸭,一...
    開(kāi)封第一講書(shū)人閱讀 51,365評(píng)論 1 302
  • 那天样刷,我揣著相機(jī)與錄音,去河邊找鬼览爵。 笑死置鼻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜓竹。 我是一名探鬼主播箕母,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俱济!你這毒婦竟也來(lái)了嘶是?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛛碌,失蹤者是張志新(化名)和其女友劉穎聂喇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔚携,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡授帕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年同木,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跛十。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彤路,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芥映,到底是詐尸還是另有隱情洲尊,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布奈偏,位于F島的核電站坞嘀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惊来。R本人自食惡果不足惜丽涩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裁蚁。 院中可真熱鬧矢渊,春花似錦、人聲如沸枉证。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)室谚。三九已至毡鉴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秒赤,已是汗流浹背猪瞬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留入篮,地道東北人撑螺。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像崎弃,于是被迫代替她去往敵國(guó)和親甘晤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354