美文网首页
当面试官问到深拷贝,别再说Object.assign、JSON.

当面试官问到深拷贝,别再说Object.assign、JSON.

作者: 仰望天空的人 | 来源:发表于2021-10-12 18:32 被阅读0次

    深拷贝

    手写递归方法

    function deepCopy(obj) {
      var newobj = obj.constructor === Array ? [] : {};
      if (typeof obj !== 'object') {
        return obj;
      } else {
      for (var i in obj) {
        if (typeof obj[i] === 'object'){ //判断对象的这条属性是否为对象
          newobj[i] = deepCopy(obj[i]);  //若是对象进行嵌套调用
        }else{
            newobj[i] = obj[i];
            }
        }
        }
        return newobj; //返回深度克隆后的对象
    }
    
    var obj1 = {
        name: 'shen',
        show: function (argument) {
            console.log(1)
        }
    }
    var obj2 = deepCopy(obj1)
    console.log('obj1:', obj1)  // obj1: {name: "shen", show: ƒ}
    console.log('obj2:', obj2)  // obj2: {name: "shen", show: ƒ}
    

    第三方库 jQuery.extend 和 lodash

    $.extend( true, object1, object2 ); // 深度拷贝
    $.extend( object1, object2 );  // 浅拷贝
    
    
    var objects = [{ 'a': 1 }, { 'b': 2 }];
    var deep = _.cloneDeep(objects);
    console.log(deep[0] === objects[0]); // => false
    

    简单类型的深拷贝

    当对象或者数组内部的都是基本数据类型的话,以下的方式可以实现深拷贝。但是如果出现了引用类型嵌套引用类型的话。以下方法将不可用。

    es6解析结构 「...」

    var obj1 = {
        name: 'shen',
        show: function (argument) {
            console.log(1)
        }
    }
    var obj2 = { ...obj1 }
    obj2.name = 'shenzhiyong'
    console.log('obj1:', obj1)
    console.log('obj2:', obj2)
    

    JSON方法

    var obj1 = {
        name: 'shen'
    }
    var obj2 = JSON.parse(JSON.stringify(obj1))
    obj2.name = 'shenzhiyong'
    
    console.log('obj1:', obj1)   // obj1: {name: "shen"}
    console.log('obj2:', obj2)   // obj2: {name: "shenzhiyong"}
    
    //缺点:看下面代码。当对象里面出现函数的时候就不适用了。
    
    var obj1 = {
        name: 'shen',
        show: function (argument) {
            console.log(1)
        }
    }
    var obj2 = JSON.parse(JSON.stringify(obj1))
    console.log('obj1:', obj1)  // obj1: {name: "shen", show: ƒ}
    console.log('obj2:', obj2)  // obj2: {name: "shen"}
    

    Reflect.ownKeys 深拷贝

    未完待续
    技术交流vx群:zhusir8362

    相关文章

      网友评论

          本文标题:当面试官问到深拷贝,别再说Object.assign、JSON.

          本文链接:https://www.haomeiwen.com/subject/xwmcgltx.html