- 注意点
- 进行拷贝操作时,须加以区分引用类型和基本数据类型的值,且拷贝引用类型的值时,不是简简单单的复制其保存在栈中的指针,(即浅拷贝)而是应该复制其存储在堆中的数据。
- 解题思路 (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 = [, 'cat', true, null, undefined, [, ], {foo: 'bar'}];
console.log('数组', deepClone(arr));
// 深拷贝对象
var obj = {
name: 'wang',
age: ,
isStudent: true,
nums: [, ],
score: {
math:
}
};
console.log('对象', deepClone(obj));
复制代码
转载于:https://juejin.im/post/5bd4605bf265da0a9a39b4d8