淺拷貝,深拷貝 js

2021-10-09 19:55:46 字數 2038 閱讀 6538

堆和棧

**基本型別:**存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配。 6種基本資料型別:undefined、null、boolean、number和string,es6新增屬性symbol.他們是直接按值存放的,所以可以直接訪問。

**引用型別:**存放在堆記憶體中的物件,變數實際儲存的是乙個指標,這個指標指向另乙個位置。每個空間大小不一樣,要根據情況進行特定的分配。

當我們需要引用型別(如物件,陣列,函式等)的值時,首先從棧中獲得該物件的位址指標,然後再從堆記憶體中取得所需的資料。

深拷貝或者淺拷貝通常針對於陣列或物件

淺拷貝複製位址,複製後資料變化影響複製前資料變化,,淺拷貝是從記憶體棧中拷貝位址,

深拷貝複製資料,複製後資料變化不會影響複製前資料變化,,深拷貝是拷貝儲存在記憶體堆中的物件

2.1深拷貝方法:

2.1.1 json.parse和json.stringify(物件或者陣列,裡面有函式的實現不了,會變成null)

var a=[1,2,3]

var c=json.stringify(a);

var b=json.parse(c);

b.push(4);

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

console.log(a)//1,2,3

2.1.2 for…in&遞迴(推薦,要拷貝的資料中不含有函式情況)

這種方法適用於任何引用型別,原理是使用for…in迴圈,配合遞迴函式實現深層拷貝,for in 迴圈,如果是物件i指的是對應的鍵,如果是陣列指的是對應的索引(從0開始)

deepcopy(obj) ;

for (var key in obj) else }}

return result;

},

2.1.3 拷貝的物件中有函式的深拷貝

deepclone(data) 

var constructor = data.constructor;

var result = new constructor();

for (var key in data)

}return result;

},

2.2淺拷貝方法(一層多層都可以)

2.2.1 object.assign() (陣列,物件都可以,改變裡面的值會跟著聯動,無論資料時一層還是多層)

多層資料
var arr = [1, [7, [9]], , function(){}, null, undefined, nan];

var result= object.assign(arr);

arr[2][a]='222';

console.log(arr);

//output: [1, [7, [9]], , function(){}, null, undefined, nan];

console.log(result);

//output: [1, [7, [9]], , function(){}, null, undefined, nan];

一層資料

var arr=[1,2,3,4]

var result= object.assign(arr);

arr[1]='5'

console.log(arr);

[1,'5',3,4]

console.log(result);

[1,'5',3,4]

2.2.2 直接賦值

array.prototype.concat() 陣列的拷貝

array.prototype.slice() 陣列的拷貝

這兩個方法當資料只有一層的時候是深拷貝,但有多層資料時,非第一層資料是淺拷貝,第一層資料仍為深拷貝

js淺拷貝深拷貝

js淺拷貝深拷貝 對於想要複製的物件,如果物件裡面對應的值都是基本資料型別的,可以直接複製 也就是通過淺拷貝複製。如果對應的值有物件那麼淺拷貝是行不通的。會造成資料汙染。下面介紹淺拷貝與深拷貝實現方法。1.淺拷貝 let tem let copy for let key in tem 2.通過obj...

JS淺拷貝 深拷貝

1,前景提要 1 數字在被複製後,再修改時,不會改變原值 var a 5 var b a b 7 console.log a a不變 2 物件在被複製後,再修改時,會改變原值 var a var b a b.name hi console.log a a.name hi 2,淺拷貝 拷貝一層物件。深...

js淺拷貝 深拷貝

1.概述 淺拷貝只是拷貝一層,針對於更深層次的物件級別的資料,只是拷貝引用,因此拷貝之後再修改物件資料時,會把原來的資料一併進行修改操作。深拷貝拷貝多層,每一級別的資料都會拷貝,而物件級別的資料則會另開闢新的空間 2.淺拷貝 es6新增方法實現淺拷貝 object.assign target,sou...