• JavaScript之深浅拷贝


    在JavaScript中,数据类型包括:Undefined类型,Null类型,Boolean类型,Number类型,String类型,Object类型。

    基本数据(Undefined类型,Null类型,Boolean类型,Number类型,String类型)类型保存在栈内存,

    引用类型(Object类型)保存在堆内存中。

    根本原因在于保存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆内存中,但是可以把它的地址写在栈内存中以供我们访问。

    如果是基本数据类型,则按值访问,操作的就是变量保存的值;如果是引用类型的值,我们只是通过保存在变量中的引用类型的地址来操作实际对象。

    举例:

    1 var num=10;    //Number类型
    2 var name="张三";    //String类型
    3    
    4 var person={        //object类型(引用类型)
    5     name:"李四",
    6     age:19
    7 }

    如图:

    1,基本类型的复制

    var num1= 10 ;    //10
    var num2=num;    //10
    
    num1=20;    //20  此时num2为10  赋值的时候,在栈内存中重新开辟内存 因此互不影响
    

    2,引用类型的复制(浅拷贝与深拷贝) 先来看看浅拷贝!  

     1 var obj1={
     2     name:"张三",
     3     age:19
     4 }
     5 
     6 var obj2=obj1;  
     7 
     8 obj1.age=20;  //修改obj1的age属性的值
     9 
    10 console.log(obj1);  // age:20 ,name:"张三"
    11 console.log(obj2);  // age:20 ,name:"张三"

    你会发现你只修改了obj1里的数据,为什么obj2会跟着改变呢?我们来看看原理!

    那什么是深拷贝呢?其实深拷贝就是简单的理解为:复制了它的属性(key)和值(value),但是一个对象修改了自己的值,另一个会不跟着改变(地址不会指向同一块内存)。

    看看下面代码:

     1  var person1={
     2      name:"张三",
     3      age:19,
     4      sex:"男",
     5      source:[90,80,70],
     6      car:{
     7          name:"bw"
     8      }
     9     }
    10 
    11 var person2=deepCopy(person1)
    12 
    13  //deepCopy
    14 function deepCopy(obj){
    15      var temp=Array.isArray(obj)?[]:{}
    16      for(var key in obj){
    17         if(typeof obj[key] == "object"){
    18         temp[key]=deepCopy(obj[key])
    19      }else{
    20             temp[key]=obj[key]
    21     }
    22     }
    23     return temp
    24  }    
    25 
    26 person1.age=20;
    27 person1.name="李四";
    28 person1.sex="女";
    29 
    30 console.log(person1); // age=20,name="李四",sex="女" .....
    31 console.log(person2); // age:19,name:"张三",sex:"男" ......
    32     

    如图:

  • 相关阅读:
    探索事务日志与恢复模式(1-13)
    sql server 复制、镜像常见故障处理
    (3.2)mysqldump之备份单个表及脚本批量备份
    Log Explorer 恢复误删除、更新数据
    ApexSQL Log 从意外UPDATE和DELETE操作中恢复SQL Server数据
    ApexSQL Recover 恢复一个被drop的表的数据
    数据库参数调优--自动更新统计信息
    T-SQL利用笛卡尔积/窗口函数_分析函数/表连接累计、累加
    【生产问题】-dbcc checkdb报错-数据页故障
    (4.4)dbcc checkdb 数据页修复
  • 原文地址:https://www.cnblogs.com/kongyijilafumi/p/12594165.html
Copyright © 2020-2023  润新知