zoukankan      html  css  js  c++  java
  • 深拷贝

    
    
     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方法
    • 建立相对应的数组对象
    • 再次进行递归
  • 相关阅读:
    面向目标的场景设置--Goal-Oriented Scenario
    第二十二课 打造专业的编译环境(下)
    第二十一课 打造专业的编译环境(中)
    第二十课 打造专业的编译环境(上)
    第十九篇 路径搜索的综合示例
    第八十课 最长不下降序列
    第七十九课 最短路径(Floyd)
    第七十八课 最短路径(Dijkstra)
    第七十七课 最小生成树(Kruskal)
    第76课 最小生成树(Prim)
  • 原文地址:https://www.cnblogs.com/doumian/p/12616824.html
Copyright © 2011-2022 走看看