1. 使用JSON.stringify() 和 JSON.parse() 将对象转为字符串之后在转为对象
obj = {
a:NaN,
b: undefined,
c:new Date(),
d:new RegExp(/\d/),
d:new Error(),
e:Infinity
}
console.log(obj);
let Obj2 = JSON.parse(JSON.stringify(obj))
console.log(Obj2);
缺陷:
- NaN ==> null
- undefined ==> 空
- 时间戳 ==> 字符串时间
- 错误信息 ==> 空对象
- Infinity ==> null
2. 使用拓展运算符与Object.assign()
let obj = {name:'Aos',age:25};
let obj2 = {...obj}
var obj3 = Object.assign({},obj);
优点:数量较少的时候使用方便、简单,
缺点:只能拷贝外层不能拷贝内层,遇到对象或数组键比较多时,操作不方便
3. 递归赋值
obj = {
a: { name: 'abc' },
b: 2
}
function fn(obj) {
let newObj = {}
if(typeof obj !=='object') return '不是一个对象'
for (const key in obj) {
typeof obj[key] ==='object'? newObj[key]=fn(obj[key]): newObj[key]=obj[key]
}
return newObj
}
let newObj = fn(obj)
完美深拷贝不光外层的引用地址该变了 内层的引用数据类型也发生改变