深浅拷贝
浅拷贝
浅拷贝指的是只复制的地址,还是指向的同一个对象,修改复制后的对象,原来的对象也发生改变。
浅拷贝方式
1.创建浅拷贝函数
js
function simpleClon(object) {
let obj = {}
for (const i in object) {
obj[i] = object[i]
return obj
}
}
2.Object.assign()
js
let copyObj = Object.assign(obj);
3.展开运算符
js
const obj2 = {...obj};
深拷贝
深拷贝是指两个对象是两个独立的对象,修改属性不会相互影响
深拷贝方式
1.创建深拷贝函数
可以处理:
- 普通值
- 数组和对象
- 函数
- symbol
- set和map
- 循环引用
js
//判断是否为对象
function isObject(value) {
const typeValue = typeof value;
return value !== null && (typeValue === "object" || typeValue === "function");
}
//深拷贝函数
//将map设置为参数,使每次使用的都是同一个map
function deepClone(originValue, map = new Map()) {
//如果是set
if (originValue instanceof Set) {
return new Set([...originValue]);
}
//如果是map
if (originValue instanceof Map) {
return new Map([...originValue]);
}
if (typeof originValue === "symbol") {
//如果值是Symbol
return Symbol(originValue.description);
}
//如果是一个函数
if (typeof originValue === "function") return originValue;
//如果是一个普通值
if (!isObject(originValue)) return originValue;
//如果map中存在创建过得对象,不用再次创建直接引用就可以
if (map.has(originValue)) {
return map.get(originValue);
}
//创建对象
let newObject = Array.isArray(originValue) ? [] : {};
//处理循环引用,第一次创建newObject后,将其保存到map中,
map.set(originValue, newObject);
for (const key in originValue) {
//将参数map在此传进去
newObject[key] = deepClone(originValue[key], map);
}
//处理key为symbol
const Skeys = Object.getOwnPropertySymbols(originValue);
for (const sKey of Skeys) {
//将参数map在此传进去
newObject[sKey] = deepClone(originValue[sKey], map);
}
return newObject;
}
2.Json拷贝
js
//JSON.stringify() 将obj转换为字符型,然后通过JSON.parse() 再转回对象,可以实现深拷贝
//因为字符串是原始类型,会进行深拷贝
let deepObj = JSON.parse(JSON.stringify(obj));