深拷贝


 let obj = {
     name: 'james',
     age: 23,
     height: 198,
     color: ['red', 'green', 'yellow', 'deeppink'],
     firends: {
       name: 'xiaoming',
       age: 23 
     },
     hope: function () {
       console.log('movies'); 
     },
     __proto__: {
       happy: function () {

       },
       eat: function () {

       }
     }

   }

   
   let obj1 = {}
   function deepClone(target, origin) {
     var target = target || [],
         toStr = Object.prototype.toString,
         arrStr = "[object Array]";
         //首先进行对象遍历 for ...in 循环
         for (var key in origin) {
          //  使用hasOwnProperty是排除掉对象__proto__ 我们一般克隆不会去克隆这个里边的属性方法
           if(origin.hasOwnProperty(key)) {
            //  判断是不是对象  是对象再判断是数组还是对象  不是对象直接把值给到新的对象
             if(typeof(obj[key]) === 'object') {
               if(toStr.call(origin[key]) === arrStr) {
                 target[key] = []
               }else {
                 target[key] = {}
               }
               //这里边比较绕的是 当判断是对象或者数组的时候 要新建一个对象或数组 这个时候 进行递归 直到找到出口 就是是原始类型 这块不是明白的建议看下相关拷贝的视频课程 
               deepClone(target[key], origin[key])
             }else {
               target[key] = origin[key]
             }
           }
         }
         return target
   }
   deepClone(obj1, obj)

1、思路 :

  • 首先遍历对象 for in 循环
  • 判断是否原始值  typeof   object
  • 判断是数组还是对象  这里使用对象原型上toString方法
  • 建立相对应的数组对象
  • 再次进行递归
posted @ 2020-04-01 23:31  性感的沙皮  阅读(132)  评论(0编辑  收藏  举报