JS基本 淺拷貝和深拷貝

2021-09-25 03:53:04 字數 1345 閱讀 3263

/*

* 基本型別儲存在棧記憶體,引用型別儲存在堆記憶體,堆比棧大(適合存放大資料),棧比堆速度快(適合查詢)

* * 基本型別:undefined null number string boolean

* 引用型別:object

* * 基本型別賦值:a=3;b=a;b=4;console.log(a,b) //3,4

* var a=;

var b=a; //將這個位址賦值給b

b.name='sss' //b修改資料,a和b共享資料,於是a的資料也發生改變

console.log(b.name); //sss

console.log(a.name); //sss

a=console.log(b.name) //sss

console.log(a.name) //zsm

* */

/** 在乙個為引用型別(object)的變數:這個變數是乙個物件時,將這個a變數賦值給另乙個b變數,b改變值,a也會改變

* //淺拷貝的實現

function copyclone(obj) //建立乙個物件

for(var i in obj);

return newobj

};var obj=;

var obj2=copyclone(obj);

obj2.name='zz';

console.log(obj); //name:111

console.log(obj2); //name:'zz'

實現淺拷貝的方法:建立乙個新的物件,迴圈遍歷傳入的引數物件,將該物件的值push進新的物件

function copyclone(obj) 

for(var i in obj);

return newobj

};var obj=

};var obj2=copyclone(obj);

obj2.name='zz';

obj.data.type='post';

console.log(obj); //111 post

console.log(obj2); //zz post

1、使用json var obj2=json.parse(json.stringify(obj2));----壞處:拋棄原來的constructor,物件只能是能被json識別的資料

2、使用assign var obj2=object.assign({},obj1),如此一來obj2的修改完全影響不到obj1了,但是注意這裡的obj1只能是乙個簡單物件,如不能是乙個複雜物件:}

3、使用create

* */

JS深拷貝和淺拷貝

js中物件分為基本型別和復合 引用 型別,基本型別存放在棧記憶體,復合 引用 型別存放在堆記憶體中 堆記憶體中用於存放由new建立的物件,棧記憶體存放一些基本型別的變數和物件的引用變數 對於簡單變數,記憶體小,直接複製不會發生引用 var a 123 var b a a 123456 console...

JS淺拷貝和深拷貝

1.淺拷貝 copy var obj1 物件存放於堆記憶體中,物件中的鍵值對,值可以為物件,可以為陣列.var obj2 obj1 物件,陣列之間只有引用賦值 obj2.name 撒哈哈 當改動物件obj2的時候,obj1的key對應的value也會更改這是淺拷貝 深拷貝 var obj1 var ...

js深拷貝和淺拷貝

走在前端的大道上 var m var n m n.a 15 這時m.a的值是多少 m.a會輸出15,因為這是淺拷貝,n和m指向的是同乙個堆,物件複製只是複製的物件的引用。深拷貝和上面淺拷貝不同,就是徹底copy乙個物件,而不是copy物件的引用,例如,還是之前的例子,我們這麼寫 var m var ...