js中的變數型別分為 基本型別 和 引用型別;對基本型別進行複製操作會對值進行乙份拷貝,而對引用型別賦值,則會進行位址的拷貝,最終兩個變數指向同乙份資料。
// 基本型別
var a = 1;
var b = a;
a = 2;
console.log(a, b); // 2, 1 ,a b指向不同的資料
// 引用型別:指向同乙份資料
var a = ;
var b = a;
a.c = 2;
console.log(a.c, b.c); // 2, 2 全是2,a b指向同乙份資料
其實深拷貝和淺拷貝都是針對的引用型別。淺拷貝就是只進行一層拷貝,深拷貝就是無限層級拷貝
。
例:
(先忽略shadowcopy\deepcopy的具體實現)
var a1 = };
var a2 = shadowcopy(a1); // 淺拷貝
a2.b.c === a1.b.c // true
var a3 = deepcopy(a1); // 深拷貝
a3.b.c === a1.b.c // false
//物件淺拷貝
function shadowcopy(obj) else ;
newobj.constructor = obj.constructor;//保留物件的constructor屬性
}for(var prop in obj)
}return newobj;
}var obj = ;
var obj2 = shadowcopy(obj);
console.log(obj.arr[0]); //1
obj2.arr[0] = 9;
console.log(obj.arr[0]); //9
上述**實現了淺拷貝,會有不能正確實現陣列的淺拷貝
和拷貝操作丟失了物件的constructor屬性
的問題。
那麼深拷貝可能就需要層層遞迴,複製物件的所有屬性,包括物件屬性的屬性的屬性,有人想出了用json的解析實現,如下**:
function deepcopy(obj)
var str = json.stringify(obj);
return json.parse(str);
}
上面的方法不適用的條件是
可以看下面的栗子:
var obj =
};var obj2 = json.parse(json.stringify(obj));
console.log(obj2);//輸出:object
這個時候還是要層層遞迴來不同情況不同分析來考慮的,最終的方案如下:
//物件深拷貝
function deepcopy(obj);
newobj.constructor = obj.constructor;
if(typeof obj !== "object") else if(window.json) else else if(typeof obj[prop] === 'object') else }}
return newobj;
}var obj = ;
var obj2 = deepcopy(obj);
console.log(obj.arr[0]); //1
obj2.arr[0] = 9;
console.log(obj.arr[0]); //1
注:object.assign()是深拷貝 js深拷貝與淺拷貝
1 基礎知識 基本型別與引用型別 js中可以把變數分成兩部分,基本型別和引用型別。基本型別包括 undefined null boolean number和string 引用型別值可能由多個值構成的物件。在對基礎型別資料進行拷貝時,實際相當於建立新的相同資料 hello 賦值給b var a hel...
js 淺拷貝與深拷貝
js 有兩種資料型別,基礎資料型別和引用資料型別 基礎資料型別都是按值訪問的,我們可以直接操作儲存在變數中的實際的值。而引用型別如array,1.淺拷貝 只複製指向某個物件的指標,而不複製物件本身,新舊物件共享一塊記憶體 淺拷貝是指只複製一層物件,當物件的屬性是引用型別時,實質複製的是其引用,當引用...
js深拷貝與淺拷貝
實現乙個頁面或者乙個功能時,常常遇到的場景需要我們備份乙個陣列或者物件,這時候出現了深拷貝與淺拷貝效果截然不同呀總結如下 var arr 1,2,3,4 shallowarr arr arr 0 change console.log arr console.log shallowarr change...