JS的深拷貝和淺拷貝

2021-10-03 04:57:49 字數 1372 閱讀 3066

淺拷貝是拷貝一層,深層次的物件級別的就拷貝引用;深拷貝是拷貝多層,每一級別的資料都會拷貝出來。 其實總結來看,淺拷貝的時候如果資料是基本資料型別,那麼就如同直接賦值那種,會拷貝其本身,如果除了基本資料型別之外還有一層物件,那麼對於淺拷貝而言就只能拷貝其引用,物件的改變會反應到拷貝物件上;但是深拷貝就會拷貝多層,即使是巢狀了物件,也會都拷貝出來。

實現淺拷貝的第一種方法

es6中的object.assign方法,object.assign是es6的新函式。object.assign() 方法可以把任意多個的源物件自身的可列舉屬性拷貝給目標物件,然後返回目標物件。但是 object.assign() 進行的是淺拷貝,拷貝的是物件的屬性的引用,而不是物件本身。

引數:需要合併的兩個物件(拷貝的話,空物件放在第乙個引數)

var obj1 = }; 

var cloneobj1= object.assign({}, obj1);

cloneobj1.a = "changed";

cloneobj1.b.a = "changed";

console.log(obj1.a); //hello

console.log(obj.b.a); // "changed"

實現淺拷貝的第二種方法

利用的是擴充套件運算子…,利用擴充套件運算子對物件進行拷貝也是一種淺拷貝

1、手動複製

把乙個物件的屬性複製給另乙個物件的屬性,但是很麻煩

var obj1 = ;

var obj2 = ;

obj2.b = 100;

console.log(obj1);

//

console.log(obj2);

//

2、轉成 json 再轉回來

用json.stringify把物件轉成字串,再用json.parse把字串轉成新的物件。這種方法簡單易用,但它會拋棄物件的constructor,

var obj1 =  };

var obj2 = json.parse(json.stringify(obj1));

obj2.body.a = 20;

console.log(obj1);

// } <-- 沒被改到

console.log(obj2);

// }

console.log(obj1 === obj2);

// false

console.log(obj1.body === obj2.body);

// false

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 ...