js的深拷貝和淺拷貝

2021-10-02 13:45:48 字數 1588 閱讀 4357

深拷貝和淺拷貝也是針對引用型別(object、array)而言的;而像基本型別,它們在棧記憶體中佔據著固定大小的空間,乙個變數複製另乙個變數,只會建立這個值的副本(值相等),兩個變數卻互不影響,當然基本資料型別是不能新增屬性的

var a = 1;

var b = a;

a = 2;

a.name ='a';

console.log(a); //2

console.log(b); //1

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

平常用 = 賦值操作符賦值,就是淺拷貝,只複製了物件的引用指標

var obj1 = 

var obj2 = obj1;

obj1.name = "oop";

console.log(obj1.name); // "oop"

console.log(obj2.name); // "oop"

1.陣列的深拷貝:slice()、concat(),但是這兩個方法僅適用於對不包含引用物件的一維陣列的深拷貝

var arr1 = [ 'a','b','c']

var copy1 = arr1.slice(0);

copy1[0] = 'd';

console.log(arr1); //['a','b','c']

console.log(copy1); //['d','b','c']

var arr2 = [ ,];

var copy2 = .concat(arr2);

arr2[0].name ="feifei";

console.log(arr2); //[ ,];

console.log(copy2); //[ ,];

陣列的深拷貝也可以借助es6的擴充套件運算子實現

var arr = [1,2,3]

var [ ...arr2 ] = arr

arr[0] = 5

console.log(arr) //[5,2,3]

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

2.物件的深拷貝:

var obj =

var = obj

obj.age = 18

console.log(obj) //

console.log(copy) //

遞迴的方法就是每一層的資料都實現一次 建立物件 -> 物件賦值的過程

function deepclone(source); // 判斷複製的目標是陣列還是物件

for(let keys in source);

targetobj[keys] = deepclone(source[keys]);

}else

} } return targetobj;

}

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