堆和棧
**基本型別:**存放在棧中的簡單資料段,資料大小確定,記憶體空間大小可以分配。 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...