JS中的變量類型分為值類型(基本類型)和引用類型;對值類型進(jìn)行復(fù)制操作會對值進(jìn)行一份拷貝,而對引用類型賦值,則會進(jìn)行地址的拷貝,最終兩個變量指向同一份數(shù)據(jù)。
一、 淺拷貝
對象只會被克隆最外部的一層,至于更深層的對象,則依然是通過引用指向同一塊堆內(nèi)存.
實(shí)現(xiàn)
- 現(xiàn)有方法
數(shù)組的淺拷貝:slice、concat
對象的淺拷貝:Object.assign() - 實(shí)現(xiàn)方法
var shallowCopy = function(obj) {
if (typeof obj !== 'object') return;
// 判斷是新建一個數(shù)組還是對象
var newObj = obj instanceof Array ? [] : {};
// 遍歷obj,并且判斷是obj的屬性才拷貝
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = obj[key];
}
}
return newObj;
}
二、深拷貝
實(shí)現(xiàn)
-
JSON.parse方法
JSON.parse(JSON.stringify(obj));
- 實(shí)現(xiàn)方法
var deepCopy = function(obj) {
if (typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}
限制:
無法實(shí)現(xiàn)對函數(shù) 、RegExp等特殊對象的克隆
會拋棄對象的constructor,所有的構(gòu)造函數(shù)會指向Object
對象有循環(huán)引用,會報錯