1.JSON方法
JSON.parse(JSON.stringify(data))
缺点:
- 无法处理循环引用:当对象中存在循环引用时,即对象的某个属性指向该对象本身,JSON.stringify()会抛出异常。
- 无法拷贝非枚举属性和方法:JSON.stringify()只能拷贝对象自身的可枚举属性,并且会忽略函数和Symbol类型的属性。
- 无法拷贝特殊的对象属性:JSON.stringify()不会拷贝对象的原型链上的属性。
- 无法处理日期对象:将日期对象转换为JSON字符串后再使用JSON.parse()解析时,日期对象会变成字符串,而不是重新生成日期对象。
- 无法处理正则表达式对象:正则表达式对象在转换为JSON字符串后会变成空对象。
- 无法处理undefined和function:JSON.stringify()会将undefined和函数直接转换为null
- 无法处理Infinity和NaN:JSON.stringify()会将Infinity和NaN转换为null。
2.ES6 的扩展运算符(…)
缺点:
一层为深拷贝,多层为浅拷贝。
一层为深拷贝:
const data= {
a: 'hello',
b: 21
}
const cloneObj = {...data};
cloneObj.a = 'hi';
cloneObj.b = 25;
cloneObj;
// {
// a: "hi",
// b: 25
// }
data;
// {
// a: "hello",
// b: 21
// }
多层为浅拷贝:
```javascript
const data= {
a: 'hello',
b: 21,
info:{
name: 'data'
}
}
const cloneObj = {...data};
cloneObj.a = 'hi';
cloneObj.b = 25;
cloneObj.info.name= 'clone';
cloneObj;
// {
// a: "hi",
// b: 25,
// info:{
// name: 'clone'
// }
// }
data;
// {
// a: "hello",
// b: 21,
// info:{
// name: 'clone'
// }
// }