1.浅拷贝值的变化相互影响
let obj1 = { a: 1, b: [1, 2, 3], c: '小三', d: new Date(), e: /^0\d{2,3}-?\d{7,8}$/ }
let obj2 = {}
obj2 = obj1 //浅拷贝
obj2.a = 5
console.log(obj2, obj1);
2.深拷贝值的变化不受影响
let obj1 = { a: 1, b: [1, 2, 3], c: '小三', d: new Date(), e: /^0\d{2,3}-?\d{7,8}$/ }
let obj2 = {}
obj2 = JSON.parse(JSON.stringify(obj1)) //深拷贝
obj2.a = 5
console.log(obj2, obj1);
Tip: 这个写法的弊端:如果对象里有正则编译为空,如果有时间编译出日期格式会变化
"2021-03-23T06:36:41.188Z"<===Tue Mar 23 2021 14:36:41 GMT+0800 (中国标准时间) {}
3.递归深拷贝(解决上面两个弊端)
let obj1 = { a: 1, b: [1, 2, 3], c: '小三', d: new Date(), e: /^0\d{2,3}-?\d{7,8}$/ }
function deepClone(obj) {
//过滤特殊情况
if (obj === null) return null
if (typeof obj !== 'object') return obj
if (obj instanceof RegExp) {
return new RegExp(obj)
}
if (obj instanceof Date) {
return new Date(obj)
}
//不直接创建空对象目的:克隆的结果和之前保持相同的所属类
let newObj = new obj.constructor;
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key])//递归深拷贝
}
}
return newObj
}
let obj2 = deepClone(obj1)
obj2.a = 5
console.log(obj2, obj1)