講到深淺拷貝,涉及到JavaScript的數據類型。js中的數據類型分爲基礎型和引用型。基礎型存儲在棧中,引用類型存儲在堆中。
基礎類型並沒有深淺拷貝之說,這裏所說的深淺拷貝針對的是引用類型數據而言(牢牢記住這句)。
通俗點講,區分深/淺拷貝,就是假設B複製了A,當修改A時,如果B也跟着變了,說明這是淺拷貝,如果B沒變,那就是深拷貝。
for..in循環遍歷所有可枚舉的屬性的鍵,包括繼承來的屬性的鍵。
Object.keys()返回所有自有可枚舉屬性的鍵。
Object.values()(ES7)返回所有可枚舉屬性的值。
Object.entries()(ES7)可返回所有可枚舉屬性的鍵和值。
實現深拷貝的方法:
1.遞歸
function deepCopy(obj){
let objCopy = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
if(obj[key]&&typeof obj[key] ==="object"){
objCopy[key] = deepCopy(obj[key]);
}else{
//如果不是,簡單複製
objCopy[key] = obj[key];
}
}
}
}
return objCopy;
}
let a=[1,2,3,4],
b=deepCopy(a);
a[0]=2;
console.log(a,b);
2.除了遞歸,我們還可以借用JSON對象的parse和stringify
function deepClone(obj){
let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
3.除了上面兩種方法之外,我們還可以借用JQ的extend方法。
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
4.該博客結合數組去重那篇博客,再去看看之前的自選功能博客,會發現有很大的優化空間!!!