浅拷贝
只对第一从重新赋址,里面的内容依旧是原来的地址let newdata = Object.assign([], ary1, ary2, ...)
1、Object.assign()
let a = {};
Object.assign({}, a) === a; // false
let c = {b: {}};
Object.assign({}, c).b === c.b; // true
2、利用扩展运算符
// 对象
let a = {b: 2}
let newdata = {...a}
// 数组
let a = [1, 2, 3]
let newdata = [...a]
深拷贝
对深层嵌套的数据结构进行拷贝,每一层都要重新赋址
递归
缺点:当对象存在循环引用时,会死递归,解决方案,可以来个对象,数组,new Map(),等来记录,已拷贝的对象,如果存在相同的,就做特殊处理
let copyAry = [];
function deepCopy(data) {
copyAry.push(data);
const newData = Array.isArray(data) ? [] : {};
if (data && typeof data === "object") {
for (let k in data) {
if (data.hasOwnProperty(k)) {
if (data[k] && typeof data[k] === "object") {
if (copyAry.includes(data[k])) {
newData[k] = data[k] // 当存在已拷贝的对象时,可以直接赋值或者给 null,从此之后,无法实现拷贝。
} else {
newData[k] = deepCopy(data[k]);
}
} else {
newData[k] = data[k];
}
}
}
}
console.log(newData);
return newData
}
let a = {
b: 1,
}
a.c = a
deepCopy(a)
JSON.parse(JSON.stringify())
遇到对象中有以下情况 会出错。
1.原对象中值为 undefined 或者 function类型 的key会丢失
2.时间对象,会变成字符串形式
3.RegExp定义的属性会变成 {}
4.NaN 类型会变成 null
5.对象存在循环引用,会报错 Uncaught TypeError: Converting circular structure to JSON
,将循环结构转换成JSON
let a = {
a: { b: 1, c: [1, 2]},
c: 2
}
let newdata = JSON.parse(JSON.stringify(a))