深拷贝实现有好几种,主要说一下JSON.parse(JSON.stringify()):
JSON.stringify():默认情况下输出的json字符串不包含任何空格字符串或者缩进
JSON.parse():把json字符串解析为原生的js值
Json.parse(JSON.stringify())实现深拷贝的原理:
利用 JSON.stringify()将js对象序列化(json字符串),在使用json.parse()来反序列化(还原)js对
象(序列化的作用是存储与传输)
使用他的时候要注意以下情况:
1.json里如果有时间对象的话,会被转为String类型的
2.参数名有regexp,error的会返回空
3.有方法的方法会丢失
4.有undefined的也会丢失
4.如果数据是NAN,Infinity的会被变成null
5.如果数据是构造函数的话,序列化后则会丢失对象constructor
6.数据对象存在循环引用,也无法实现深拷贝
jq实现深拷贝:
1. let a = []
b = a.slice()
这种实现的话如果a里的数据有数组是无法实现深拷贝的
2.let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
需要依赖jq
递归方法实现深拷贝
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
(非最佳)