# 浅拷贝和深拷贝
# 概念
浅拷贝是拷贝引用地址,而非这个地址指向的堆内存中的值,拷贝后的对象改变后,源对象也跟着变。
深拷贝是拷贝堆内存的值,拷贝后的对象改变后,源对象不变。
# 实现深拷贝的方法
- 递归去拷贝所有层级的属性
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {};
if(obj && typeof obj === 'object'){
for(let key in obj){
if(obj.hasOwnProperty(key)){
//判断obj属性是否为对象 如果是,递归赋值
if(obj[key] && typeof obj[key] === 'object'){
objClone[key] = deepClone(obj[key]);
}else{
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- JSON对象来实现,但是对象中的方法无法拷贝
function deepClone(obj){
return JSON.parse(JSON.stringify(obj));
}
1
2
3
2
3
- lodash函数库
let res = _.cloneDeep(obj);
1
- 使用Object.create(oldObj)
function deepClone(initalObj,finalObj){
let obj = finalObj || {};
for(let i in initalObj){
let prop = initalObj[i];
if(prop === obj){
continue;
}
if(typeof prop === 'object'){
obj[i] = (prop.constructor === Array) ? [...prop] : Object.create(prop);
}else{
obj[i] = props;
}
}
return obj;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
← 对象的两种创建方式 Linux免密远程登录 →