浅拷贝和深拷贝

184 阅读1分钟

一. 浅拷贝

浅拷贝只是拷贝一层,更深层次对象级别的只拷贝地址(引用)

         var obj = {
                    uname: "zly",
                    salary: 100000,
                    ff: {
                        age: 20,
                    }
                }
          var kao = {};
          for (var k in obj) {
             // k 是属性名, obj[k]是属性值
             kao[k] = obj[k];
              }
          console.log(kao);
          kao.ff.age = 30;
          console.log(obj); 
      // 浅拷贝对于更深层次的对象级别只拷贝了地址,修改数据后,会影响原来的 被拷贝对象

浅拷贝的语法糖:

Object.assign()

     var obj = {
                        uname: "zly",
                        salary: 100000,
                        ff: {
                            age: 20,
                        }
                    }
     var kao = {};
     Object.assign(kao, obj);
     console.log(kao);
     kao.ff.age = 12;
     console.log(obj);`

二. 深拷贝

①深拷贝拷贝多层,每一级别的数据都会被拷贝。 ② 深拷贝中,修改对象级别中的数据时,不会影响原被拷贝对象中的数据。 (因为在拷贝被拷贝对象的对象级别的数据时,又开辟了一个新的内存地址存放数据)

         var obj = {
                    uname: "zly",
                    salary: 100000,
                    ff: {
                        age: 20,
                    },
                    lucky_num: [1, 3, 5]
                };
          var xin = {};
         // 封装函数
          function deepCopy(kao, beikao) {
                 for(var k in beikao) {
             // 判断属性值属于哪种数据类型
                // 1. 获取属性值
                 var item = beikao[k];
                // 2. 判断这个值是否是数组
                 if (item instanceof Array) { 
               // 必须先判断是否是数组,再判断是否是对象(因为数组也是属于对象Object)
                          kao[k] = [];
                          deepCopy(kao[k], item);
                     }else if (item instanceof Object) {
                         // 3. 判断值是否是对象
                        kao[k] = {};
                        deepCopy(kao[k], item);
                     }else {
                         // 4. 值属于普通数据类型时
                        kao[k] = item;
                     }
                    }
                }
                deepCopy(xin, obj);
                console.log(xin);
                xin.ff.age = 30;
                xin.lucky_num = [1, 2, 3];
                console.log(obj); // 不会影响被拷贝对象的数据

检测数组是否属于对象:

     var a = [];
     console.log(a instanceof Object);