JS中的深拷貝與淺拷貝

2021-09-13 20:26:36 字數 1667 閱讀 3989

深拷貝和淺拷貝最根本的區別在於是否是真正獲取了乙個物件的複製實體,而不是引用,

深拷貝的實現:

1.通過遞迴解決

var a=};

function deepcopy(initobj,finalobj) ;

for(var i in initobj)

if(typeof initobj[i]==='object');

// arguments.callee(initobj[i],obj[i]);

deepcopy(initobj[i],obj[i]);

}else

}return obj;

}var b=deepcopy(a);

b['name']='武漢';

b.c.name='長江';

console.log(a);

console.log(b);

2.使用object.create

var a=};

function deepcopy(initobj,finalobj) ;

for(var i in initobj)

if(typeof prop==='object')else

}return obj;

}var b=deepcopy(a);

b['name']='武漢';

b.c.name='長江';

console.log(a);

console.log(b);

3.借助json

var a=,d:function () };

var b=json.parse(json.stringify(a));

b['name']='武漢';

b.c.name='長江';

console.log(a);

console.log(b);

console.log(a.d);

console.log(b.d);

這種方法的缺點是無法複製函式,再就是原型鏈沒了,物件就是object,所屬的類沒了.

4、object.assign()處理一層的深度拷貝

var a=;

var b=object.assign({},a);

b.name='南京';

console.log(a);

console.log(b);

陣列的拷貝,es6有array.from和...兩種方法不會發生引用,js中的slice和concat

var a=[1,2];

var b=array.from(a);

b.push(3);

var c=[...a];

c.push(4);

var d=a.slice(0);

d.push(-1);

var e=a.concat([5]);

console.log(a); //[1,2]

console.log(b); //[1,2,3]

console.log(c); //[1,2,4]

console.log(d); //[1,2,-1]

console.log(e); //[1,2,5]

js中的深拷貝與淺拷貝

今天面試被問到js中深淺拷貝的問題,當時回答的並不好,回來搜尋了一波,現做下總結 js中針對引用型別的拷貝分為兩種 深拷貝和淺拷貝 淺拷貝比較簡單,分為兩類,一類是直接對源物件進行拷貝,實際上就是引用型別的賦值,拷貝的僅僅是物件引用,如 var obj var newobj obj newobj.a...

JS中的深拷貝與淺拷貝

說到深淺拷貝的時候就不得不說一下js中的變數型別了 淺拷貝分兩種情況,拷貝源物件的引用和源物件拷貝例項,但其屬性拷貝引用.拷貝源的引用 eg let obj1 let obj2 obj1 console.log obj1 obj2 true obj1.a 2 console.log obj2.a 2...

JS中的深拷貝與淺拷貝

淺拷貝是物件的逐位複製。建立乙個新物件,該物件具有原始物件中值的精確副本。如果物件的任何欄位是對其他物件的引用,則只複製引用位址,即,複製記憶體位址。大白話講就是,淺拷貝是對物件位址的複製,並沒有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變...