js的浅拷贝与深拷贝

浅拷贝

  1. Object.assign()
    1
    2
    let obj = {}
    Object.assign({},obj)
  2. 展开运算符
    1
    2
    let obj = {}
    const obj2 = {...obj}

深拷贝

  1. JSON.parse(JSON.stringify(obj))
    1
    2
    let obj = {}
    const obj2 = JSON.parse(JSON.stringify(obj))
    此方式仅适用于对象,数组,不适合函数、Date等类型,如果是循环的引用,会造成死循环
  2. 递归
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    const deepClone = (obj, map = new WeakMap()) => {
    //判断传进来的list是否为引用类型数据
    if (typeof obj === 'object') {
    //通过list的constructor来指定cloneList的类型
    const cloneObj = new obj.constructor
    //如果是Date,RegExp类型直接返回
    if (obj instanceof Date) return new Date(obj)
    if (obj instanceof RegExp) return new RegExp(obj)
    //如果传进来的list已经存在于map中直接返回对应的value
    if (map.has(obj)) {
    return map.get(obj)
    }
    //保存每个list key
    map.set(obj, cloneObj)
    for (const key in obj) {
    //不循环原型上的key
    if (Object.hasOwnProperty.call(obj, key)) {
    //每个key值等于deepClone的函数返回值,把新的map作为参数传递
    cloneObj[key] = deepClone(obj[key], map)
    }
    }
    return cloneObj
    } else {
    //值类型直接返回
    return obj
    }
    }


js的浅拷贝与深拷贝
https://yifengtingyu.cn/2024/04/23/js的浅拷贝与深拷贝/
作者
依风听雨
发布于
2024年4月23日
许可协议