說(shuō)起這個(gè)必然會(huì)講到js的數(shù)據(jù)類型,因?yàn)檫@個(gè)深淺拷貝是針對(duì)引用數(shù)據(jù)而言的众羡。
基本數(shù)據(jù)類型:Number侨赡,String,null,undefined羊壹,boolean
引用數(shù)據(jù)類型:Array蓖宦,Object,F(xiàn)unction
淺拷貝:只復(fù)制指向某個(gè)對(duì)象的指針舶掖,而不復(fù)制對(duì)象本身球昨,新舊對(duì)象還是共享同一塊內(nèi)存。(修改其中一個(gè)對(duì)象眨攘,新舊對(duì)象同時(shí)修改)
let obj ={
? ? a:1
}
let newObj=obj //復(fù)制引用
newObj.a=2
console.log(newObj.a,obj.a)//2 2
深拷貝:會(huì)另外創(chuàng)造新的對(duì)象主慰,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象鲫售。
深拷貝的實(shí)現(xiàn)方式:
1.逐個(gè)屬性的復(fù)制
2.object.assign() // 該方法只能復(fù)制一層
3.通過(guò)Json
4.遞歸
function deepClone(initalObj, finalObj) {
? varobj = finalObj || {};? ?
? for(variin initalObj) {? ? ? ?
? ? varprop = initalObj[i];// 避免相互引用對(duì)象導(dǎo)致死循環(huán)共螺,如initalObj.a = initalObj的情況if(prop === obj) {? ? ? ? ? ?
? ? ? continue;
? ? }? ? ? ?
? ? if(typeofprop ==='object') {
? ? ? obj[i] = (prop.constructor === Array) ? [] : {};? ? ? ? ? ?
? ? ? arguments.callee(prop, obj[i]);
? ? } else {
? ? ? obj[i] = prop;
? ? }
? }? ?
? return obj;
}varstr = {};varobj = { a: {a:"hello", b:21} };
deepClone(obj, str);
console.log(str.a);