• 谈谈js中深度克隆和浅度克隆


    在js中,我们通常通过var创建一个json对象来方便存储数据,

    var template = {

      user:'张某',

      password:'',

      tem:['标签1','标签2']

    }

    这种方式一般作为标准数据格式。

    我们先来讲浅度克隆

    然后我们观察下面代码

    function setObject(obj){
      var newObj = {};
      for(var i in obj){
        newObj[i] = obj[i]
      }
      return newObj;
    }

    var tem2 = setObject(template);
    tem2.user="肖某";
    tem2.password = "123";
    tem2.tem.push('音乐');

    var tem3 = setObject(template);
    tem3.user="刘某";
    tem3.password = "123456";
    tem3.tem.push('体育');

    console.log(tem2) //

    1. "标签1"
    2. 1:"标签2"
    3. 2:"音乐"
    4. 3:"体育"


    console.log(tem3) //

    1. "标签1"
    2. 1:"标签2"
    3. 2:"音乐"
    4. 3:"体育"

    通过打印看到tem2的tem跟tem3的tem的数组一样。

    这很好理解,因为简单的复制对象,如果对象其中一个属性是引用型变量,就会出现这种情况,因为引用型变量保存的是内存地址,所以其实后来操作的都是同一块内存,导致了数组内容都一样。

    再来看看下面这种情况

    function setObject(obj,newObj){
      var newObj = newObj || {};
      for(var i in obj){
        if(typeof obj[i] == 'object'){
          newObj[i] = (obj[i].constructor === Array) ? [] : {}
          setObject(obj[i],newObj[i])
        }else{
          newObj[i] = obj[i]
       }
    }
       return newObj;
    }

    var tem2 = setObject(template);
    tem2.user="肖某";
    tem2.password = "123";
    tem2.tem.push('音乐');


    var tem3 = setObject(template);
    tem3.user="刘某";
    tem3.password = "123456";
    tem3.tem.push('体育');

    console.log(tem2) //tem2.tem

           Array(3)

      1. 0:"标签1"
      2. 1:"标签2"
      3. 2:"音乐"
      4. length:3


    console.log(tem3) // tem3.tem

      1.   Array(3)
      2. 0:"标签1"
      3. 1:"标签2"
      4. 2:"体育"
      5. length:3

    深克隆就是在克隆的时候判断一下属性的类型是不是引用型变量,如果是的话就用递归方法让它一层一层进去复制自己。

    这就是深度克隆了,其实是JS的继承的方法的一种。

  • 相关阅读:
    小程序学习过程中遇到的问题
    小程序云函数调用webservice接口
    小程序云函数调用http或https请求外部数据
    MQTT Web Toolkit
    mqtt.mini.js 使用
    MQTT 浏览器 mqttws31.min.js
    MQTT.js browser node 均支持
    mqtt开源服务器 EMQX ,客户端MQTTX5.0,使用指南
    vue调试工具vue-devtools安装及使用方法
    Js 类继承 extends
  • 原文地址:https://www.cnblogs.com/chw8/p/8323586.html
Copyright © 2020-2023  润新知