# 深拷贝

  1. 递归
    注意: 嵌套过深会栈溢出

    function deepClone(obj) {
      let objClone = Array.isArray(obj) ? [] : {}
      if (obj && typeof obj === 'object') {
        for (let key in obj) {
          if (obj[key] && typeof obj[key] === 'object') {
            objClone[key] = deepClone(obj[key])
          } else {
            objClone[key] = obj[key]
          }
        }
      }
      return objClone;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    改进:

      
    
    1
  2. JSON.parse 注意:

    • 会忽略 undefined
    • 会忽略 Symbol
    • 无法序列化function,也会忽略
    • 无法解决循环引用,会报错
    • 深层对象转换爆栈
    function deepCloneByJson(obj) {
      const str = JSON.stringify(obj)
      return JSON.parse(str);
    }    
    deepCloneByJson([{a:123,name:function () {}}])  // [ { a: 123 } ]
    
    1
    2
    3
    4
    5
  3. Object.assign() 注意:
    对于Object.assign()而言,如果对象的属性值为简单类型(string,number),
    通过Object.assign({},srcobj);得到的新对象为深拷贝;如果属性值为对象或其他引用类型,
    那对于这个对象而言其实是浅拷贝的,这是Object.assign()特别需要注意的地方。

    function deepCloneByAssign(obj) {
      return  Object.assign({},obj)
    }
    let a = {height:123,name:function () {},nice: { age: {n: "1"}}}
    let b = deepCloneByAssign(a)
    b.height = 456    //修改属性
    b.nice.age = 123  //修改子类属性
    console.log(b.nice === a.nice)      //true
    console.log(b.height === a.height)      //false
    console.log(b)      // { height: 456, name: [Function: name], nice: { age: 123 } }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
最后更新时间: 6/20/2022, 10:48:50 PM