什么是 JavaScript 深度拷貝

前言:

面試的時候碰到了這么個問題罚随,在這里總結(jié)一下下硕。
什么是 Javacript 深度拷貝丁逝,既然有深度拷貝,那有沒有淺度拷貝呢梭姓?答案是有的霜幼。

舉個簡單的例子解釋一下:

淺度拷貝:就好比我們從俄羅斯買了20架蘇27戰(zhàn)斗機,飛機人家是給你了誉尖,但是技術(shù)并沒轉(zhuǎn)讓罪既,飛機壞了還得求人家來給你修。

深度拷貝:就好比我們從俄羅斯買了20架蘇27戰(zhàn)斗機铡恕,并且轉(zhuǎn)讓了全部技術(shù)琢感,這樣,我們就能自己生產(chǎn)了探熔,技術(shù)全挖過來了驹针,俄羅斯管不著了。

第一節(jié) 對象的拷貝

1祭刚、淺度拷貝
var a = {
    name:'aa',
    age:'20'
}
b = a;
b; //結(jié)果如下
/*
b = {
    name:'aa',
    age:'20'
}
*/

問:我們將對象 a 作一下修改牌捷,b 是否會跟著變墙牌?

var a = {
    name:'aa',
    age:'20'
}
b = a;
// 那么
b = {
    name:'aa',
    age:'20'
}

a.name = 'cc';
b;
/* b = { name:'cc',age:'20' } */

對象 b 是會跟著對象 a 的變動而變化的涡驮,這個我想大家應(yīng)該都明白。

2喜滨、深度拷貝

就是 a 對象的操作不會影響到 b 對象(當然捉捅,反過來亦如此)

var a = {
    name:'yy',
    age:26
};
var b = new Object();
// 注意重點來了
b.name=a.name;
b.age=a.age;

a.name='xx';
console.log(b);
//Object { name="yy", age=26}
console.log(a);
//Object { name="xx", age=26}

哎呦,還真是虽风,對象 a 變了而對象 b 沒發(fā)生變化棒口。

總結(jié)一下,其實是這樣的辜膝。
1.淺度拷貝:基本類型為值傳遞无牵,對象仍為引用傳遞。
2.深度拷貝:所有元素或?qū)傩酝耆寺〕Ф叮瑢τ谠妙愋屯耆毩ⅰ?/p>

上面這種寫法茎毁,對象屬性很少的情況下,是可以使用的,但是多了七蜘,就不行了。所以我們還是要寫個函數(shù)橡卤,將要拷貝的對象的屬性遍歷一遍扮念,賦值給一個新對象。如下碧库,

function deepCopy(source) {
    var result = {};
    for(var key in source) {
        result[key] = typeof source[key] === 'object'? deepCoyp(source[key]): source[key];
    } 
    return result;    
}

var a = {
    name: '小明',
    age: 18
}
b = deepCopy(a);
/* b = { name: '小明'柜与,age:18 }*/

同理,說一下數(shù)組的淺度拷貝和深度拷貝

第二節(jié) 數(shù)組的拷貝

1嵌灰、淺度拷貝
var arr = [1,2,3];
var arr2 = arr;
console.log(arr2); // [1,2,3]
arr[0] = "one";
console.log(arr1); // ["one", 2, 3]
console.log(arr2); // ["one", 2, 3]

與對象的淺度拷貝是一樣的旅挤。

2、深度拷貝

方法1:利用 slice 函數(shù)

slice() 方法可從已有的數(shù)組中返回選定的元素伞鲫。

arrayObject.slice(start,end)  // start 必選 end 可選

說明:
1.請注意粘茄,該方法并不會修改數(shù)組,而是返回一個子數(shù)組秕脓。
2.如果 end 未被規(guī)定柒瓣,那么 slice() 方法會選取從 start 到數(shù)組結(jié)尾的所有元素。

var arr = [1,2,3];
var arr2 = arr.slice(0); // 重點看這里
console.log(arr2); // [1, 2, 3]
arr = ["one","two","three"];
console.log(arr); // ["one","two","three"]
console.log(arr2); // [1, 2, 3]

方法2:利用 concat 函數(shù)

concat() 方法用于連接兩個或者多個數(shù)組吠架。

arrayObject.concat(arrayX,arrayX,......,arrayX)  

說明:
該方法不會改變現(xiàn)有的數(shù)組芙贫,而僅僅會返回被連接數(shù)組的一個副本

var arr = [1,2,3];
var arr2 = arr.concat();  // 重點看這里,concat 一個空數(shù)組進去傍药,那結(jié)果不變
console.log(arr2); // [1, 2, 3]
arr = ["one","two","three"];
console.log(arr); // ["one","two","three"]
console.log(arr2); // [1, 2, 3]

總結(jié):

說點題外話磺平,做前端也有一段時間了,以前拐辽,碰到問題就加個書簽或者建個 word 簡要的記一下拣挪。從今年開始認真的在有道云筆記上寫筆記,并且把合適的推送到自己的博客上俱诸。個人覺得建立博客的意義除了知識共享以及備忘菠劝,更重要的一點是迫使自己去思考和總結(jié),既要寫出來睁搭,還要別人能看懂赶诊,花費的時間挺多,但是值得园骆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舔痪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锌唾,更是在濱河造成了極大的恐慌锄码,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巍耗,居然都是意外死亡秋麸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門炬太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灸蟆,“玉大人,你說我怎么就攤上這事亲族〕纯迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵霎迫,是天一觀的道長斋枢。 經(jīng)常有香客問我,道長知给,這世上最難降的妖魔是什么瓤帚? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮涩赢,結(jié)果婚禮上戈次,老公的妹妹穿的比我還像新娘。我一直安慰自己筒扒,他們只是感情好怯邪,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著花墩,像睡著了一般悬秉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冰蘑,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天和泌,我揣著相機與錄音,去河邊找鬼懂缕。 笑死允跑,一個胖子當著我的面吹牛王凑,可吹牛的內(nèi)容都是我干的搪柑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼索烹,長吁一口氣:“原來是場噩夢啊……” “哼工碾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起百姓,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渊额,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旬迹,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡火惊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奔垦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹耐。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖椿猎,靈堂內(nèi)的尸體忽然破棺而出惶岭,到底是詐尸還是另有隱情,我是刑警寧澤犯眠,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布按灶,位于F島的核電站,受9級特大地震影響筐咧,放射性物質(zhì)發(fā)生泄漏鸯旁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一量蕊、第九天 我趴在偏房一處隱蔽的房頂上張望羡亩。 院中可真熱鬧,春花似錦危融、人聲如沸畏铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辞居。三九已至,卻和暖如春蛋勺,著一層夾襖步出監(jiān)牢的瞬間瓦灶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工抱完, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贼陶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓巧娱,卻偏偏與公主長得像碉怔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禁添,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

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