先说一个js概念 —>
对象序列化:是将对象的状态变成字符串(JSON.stringify),也可将字符串还原为对象(JSON.parse)。
我们通常使用这种方法对 拷贝一个js对象,但是当某些情况下,会有问题,比如下面几种情况。
-
对象中有NaN、Infinity和-Infinity的时候,序列化之后会变成null。
-
对象中有undefined和Function类型数据的时候,序列化之后会直接丢失。
-
对象中有时间类型的时候,序列化之后会变成字符串类型。
-
对象循环引用的时候,序列化之后会直接报错。
const obj = {
nan:NaN,
infinityMax:1.7976931348623157E+10308,
infinityMin:-1.7976931348623157E+10308,
undef: undefined,
fun: () => { console.log(123) },
date:new Date,
name:'张三',
wife:obj.name
}
项目中推荐使用递归的方法封装一个工具函数
//utils.js
//...
const deepCopy= (obj = {}) => {
//变量先置空
let newobj = null;
//判断是否需要继续进行递归
if (typeof (obj) == 'object' && obj !== null) {
newobj = obj instanceof Array ? [] : {};
//进行下一层递归克隆
for (var i in obj) {
newobj[i] = deepCopy(obj[i])
}
//如果不是对象直接赋值
} else newobj = obj;
console.log(newobj)
return newobj;
}
使用:
let person= {
name:'zhangsan',
age:26,
wife:{
sheName:'xiaohua',
sheAge:25
}
}
let newPerson= deepCopy(person)