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