Skip to content

深浅拷贝

浅拷贝

浅拷贝指的是只复制的地址,还是指向的同一个对象,修改复制后的对象,原来的对象也发生改变。

浅拷贝方式

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.创建深拷贝函数

可以处理:

  1. 普通值
  2. 数组和对象
  3. 函数
  4. symbol
  5. set和map
  6. 循环引用
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));