- 注意點
- 進行拷貝操作時,須加以區分引用型別和基本資料型別的值,且拷貝引用型別的值時,不是簡簡單單的複製其儲存在棧中的指標,(即淺拷貝)而是應該複製其儲存在堆中的資料。
-
解題思路 (1)方法一:分別對陣列、物件、基本資料型別值進行判斷、考慮,使用遞迴的方式複製值 (2)方法二:利用了
JSON.parse()
、JSON.stringify()
這兩個方法實現深拷貝 -
程式碼
/* 方法一 */
function deepClone (val) {
var res;
if (val && Array.isArray(val)) {
res = [];
val.forEach(function (item) {
res.push(deepClone(item));
});
} else if (typeof val === 'object' && val !== null) {
res = {};
for (let key of Object.keys(val)) {
res[key] = deepClone(val[key]);
}
} else {
res = val;
}
return res;
}
/* 方法二 */
function deepClone (val) {
if (typeof val === 'undefined') {
return;
}
var temp = JSON.stringify(val);
return JSON.parse(temp);
}
/* 測試程式碼 */
// 深拷貝基本資料型別值
var val = 'hello world';
console.log('基本資料型別值', deepClone(val));
// 深拷貝陣列
var arr = [9, 'cat', true, null, undefined, [1, 2], {foo: 'bar'}];
console.log('陣列', deepClone(arr));
// 深拷貝物件
var obj = {
name: 'wang',
age: 18,
isStudent: true,
nums: [3, 4],
score: {
math: 95
}
};
console.log('物件', deepClone(obj));
複製程式碼