基本數(shù)據(jù)類型:number芭碍、string徒役、boolean、null窖壕、undefined忧勿。
引用數(shù)據(jù)類型(Object類):對象、數(shù)組艇拍、函數(shù)狐蜕。
-
基本數(shù)據(jù)類型---名值都存在棧內(nèi)存中
let a=1
當復制b=a的時候,棧內(nèi)存會開辟一個新的內(nèi)存卸夕。
即使修改a=2,這時候?qū)并不會有任何影響快集。 -
引用數(shù)據(jù)類型--名存在棧內(nèi)存中贡羔,值存在于堆內(nèi)存中,但是棧內(nèi)存會提供一個引用地址指向堆內(nèi)存中的值
當b=a進行拷貝的時候个初,其實復制的是a的引用地址乖寒,而并非堆里面的值
當我們修改a[0]=1之后,由于a和b指向的同一個地址院溺,所以b也受到影響楣嘁,這就是淺拷貝。
如果能在堆內(nèi)存開辟一個新的內(nèi)存專門存放b的值,就如同基本類型那樣逐虚,就達到了深拷貝的效果了聋溜。
- 實現(xiàn)深拷貝
- 封裝深拷貝函數(shù)
function deepClone(obj) {
let tempClone = Array.isArray(obj) ? [] : {}; //判斷是數(shù)組還是對象
if (obj && typeof tempClone === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
tempClone[key] = deepClone(obj[key]);
} else {
tempClone[key] = obj[key];
}
}
}
}
return tempClone;
}
- 使用JSON對象的parse和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj);
let objClone = JSON.parse(_obj);
return objClone
}
- 借用JQ的extend方法
$.extend( [deep ], target, object1 [, objectN ] )- deep表示是否深拷貝,為true為深拷貝叭爱,為false撮躁,則為淺拷貝
- target Object類型目標對象,其他對象的成員屬性將被附加到該對象上买雾。
- object1 objectN可選把曼。Object類型第一個以及第N個被合并的對象。
let a=[0,1,[2,3],4];
let b=$.extend(true,[],a);