首先深復(fù)制和淺復(fù)制只針對(duì)像 Object, Array 這樣的復(fù)雜對(duì)象的鸭你。簡(jiǎn)單來(lái)說(shuō),淺復(fù)制只復(fù)制一層對(duì)象的屬性擒权,而深復(fù)制則遞歸復(fù)制了所有層級(jí)袱巨。
一、淺拷貝
在有指針的情況下碳抄,淺拷貝只是增加了一個(gè)指針指向已經(jīng)存在的內(nèi)存愉老,改變newArr,arr也會(huì)變化
const arr = [1, 2, 3];
const newArr = arr; // 直接復(fù)制
newArr.reverse(); // [3,2,1]
arr // [3,2,1]
二剖效、深拷貝
深拷貝就是增加一個(gè)指針并且申請(qǐng)一個(gè)新的內(nèi)存嫉入,使這個(gè)增加的指針指向這個(gè)新的內(nèi)存,采用深拷貝的情況下璧尸,釋放內(nèi)存的時(shí)候就不會(huì)出現(xiàn)在淺拷貝時(shí)重復(fù)釋放同一內(nèi)存的錯(cuò)誤咒林。
const arr = [1, 2, 3];
// 通過(guò)JSON.parse,JSON.stringify進(jìn)行深拷貝
const newArr = JSON.parse(JSON.stringify(arr));
newArr.reverse(); // [3,2,1]
arr // [1,2,3]
三逗宁、舉例
例1:僅僅復(fù)制對(duì)象的值
var o = {a: 1};
Object.keys(o) // ['a']
o.hasOwnProperty('a') // true
var d = {a:o.a}
d // {a: 1}
d.a = 4;
d // {a: 4}
a // {a: 1}
例2:通過(guò)深拷貝創(chuàng)建一個(gè)屬性值一樣內(nèi)存不一樣的對(duì)象
var e = JSON.parse(JSON.stringify(o))
e // {a: 1}
e.a = 3;
e // {a: 3}
o // {a: 1}