只有对于 Object(复杂数据类型)才有深浅拷贝一说
- 浅拷贝并不是真的拷贝,新对象仍指向原被拷贝对象的内存地址,如有更新会被同步
(引用数据类型(Object)的名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值)
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); // 2234 1234
$.extend([ deep], target, object1 [, objectN] )
deep 表示是否深拷贝,为 true 为深拷贝,为 false,则为浅拷贝
let a=[0,1,[2,3],4],
b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
利用 JSON.stringify 将 js 对象序列化(JSON 字符串),再使用 JSON.parse 来反序列化 (还原)js 对象; 序列化的作用是存储 (对象本身存储的只是一个地址映射,如果断电,对象将不复存在,因此需将对象的内容转换成字符串的形式再保存在磁盘上) 和传输(例如 如果请求的 Content-Type 是 application/x-www-form-urlencoded,则前端这边需要使用 qs.stringify(data)来序列化参数再传给后端,否则后端接受不到)
function deepClone(obj){let _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone
}
let a=[0,1,[2,3],4],
b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);
使用 JSON 做深拷贝时,被拷贝对象内如果有 date、RegExp 或者是 function 会出现一些问题