JS的深拷貝 與 淺拷貝 例項

2021-08-27 05:55:48 字數 1884 閱讀 5508

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...