浅拷贝与深拷贝以及栈与堆

1.概念:

浅拷贝 :浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝:深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

2:栈与堆

栈:用来存储简单数据类型和对象的引用地址--number、string、boolean、null、undefind等

栈:用来存储复杂数据类型--Array、Object、date、RegExp等

3深拷贝案例:下面这段代码可以简单实现深拷贝但是存在弊端,但凡有复杂数据就必须要再次遍历

     var obj1 = {
        uname:'张三',
        age:21,
        scholl:{
            name:'清华',
            address:'北京'
        },
        hoppy:[
          "打篮球","吃饭","睡觉","打豆豆"  
        ]
     }
      var obj2 = {}
       // 用for in 嵌套遍实现深拷贝
    for(var k in obj1){
        // 判断数据类型
        if(obj1[k].constructor == Object){
            // 创建空对象,遍历
             obj2[k] = {}
            for(var j in obj1[k]){
             obj2[k][j] = obj1[k][j]
           }
        }else if(obj1[k].constructor == Array){
            // 创建空数组,遍历
            obj2[k] = []
            for(var m in obj1[k]){
             obj2[k][m] = obj1[k][m]
           }
        }else{
            obj2[k] = obj1[k] 
        }
       
    }
    obj2.scholl.name = "北大"
    obj2.hoppy[2] = "打游戏"
    console.log(obj2,"obj2");
    // 可以发现obj1中的数据并没有被修改
    console.log(obj1,"obj1");

用递归实现深拷贝:

  var obj1 = {
        uname:'张三',
        age:21,
        scholl:{
            name:'清华',
            address:'北京'
        },
        hoppy:[
          "打篮球","吃饭","睡觉","打豆豆"  
        ]
     }
    var obj2 = {}
      // 用递归实现深拷贝
    function deepCopy(obj2,obj1){
        for(var k in obj1){
        // 判断数据类型
        if(obj1[k].constructor == Object){
            // 创建空对象,遍历
             obj2[k] = {}
          deepCopy(obj2[k],obj1[k])
        }else if(obj1[k].constructor == Array){
            // 创建空数组,遍历
            obj2[k] = []
        deepCopy(obj2[k],obj1[k])
        }else{
            obj2[k] = obj1[k] 
        }
    }
    }
    deepCopy(obj2,obj1)
    // 修改了obj2下的scholl的属性值
    obj2.scholl.name = "qinghua"
    console.log("obj2",obj2);//发现obj2对应的属性值变了
    console.log("obj1",obj1); //obj1没有变

用 JSON.parse(JSON.stringify())可以实现暴力深拷贝

 var obj3 = {
        name:"赵六",
        age:21,
        height:170,
        school:{
            name:"北大",
            addres:"北京"
        }
    }
    var obj5 = JSON.parse(JSON.stringify(obj3))
       obj5.school.name = "清华"
    //    可以发现修改了obj5,不影响obj3
    console.log("obj5",obj5);
    console.log("obj3",obj3);

浅拷贝:Object.assign()  当然这里只列举了这一种方法,实现浅拷贝还有方法,这个最简单

  var obj3 = {
        name:"赵六",
        age:21,
        height:170,
        school:{
            name:"北大",
            addres:"北京"
        }
    }
     var result =  Object.assign({},obj3)
     result.school.name = "清华"
    console.log(result);
    // 发现obj3数据也变了
    console.log(obj3);

4.闭包:一个函数能够访问另一个函数内部的变量这种查找方式我们就称之为闭包。(大概意思)

function cover(){
        var num = 100
        function inter(){
           num = 10
          return num
        }
        inter()
    }
    cover() //打开断点可以发现当执行到内层函数的时候产生了闭包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值