前言:
面試的時候碰到了這么個問題罚随,在這里總結(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é),既要寫出來睁搭,還要別人能看懂赶诊,花費的時間挺多,但是值得园骆。