zoukankan      html  css  js  c++  java
  • 深浅拷贝的理解

    开门见山直接来,先明确几个核心概念

    1.首先浅拷贝和深拷贝只针对想Object,Array这样的复杂对象,简单来说,浅拷贝只复制一层对象的属性,二深拷贝则复制了所有的层级。

    2.对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没   有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会 改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

    3.贴上代码:

    (1)浅拷贝:obj对象中的值 1 直接复制到 shallow中的1,

    但是数组地址同时指向了一个堆,没有在栈里开辟新地址,所以牵一发动全身的改变

    (2)深拷贝:无论是字符串值,还是数组的对象值,都全部深层复制一份,数组在栈里面重新开了一块地址,所以,一个改变,互不影响。

    //典型的浅拷贝 

    var obj = {a:1,
    b:[1,2,3,4,5]
    }
    function shallowcopy(src, options){
    var src = src || {};
    for(var item in options){
    src[item] = options[item];
    }

    return src
    }
    var newArr = {};
    var show = shallowcopy(newArr,obj)
    console.log(show);
    newArr.b[0] = 10;
    console.log(newArr,obj)
    //典型的深拷贝
    function deepcopy(src,options){
    var src= src ||{};
    for(var item in options){
    if(typeof options[item] === 'object'){
    src[item] = (options[item].constructor === Array) ? [] : {}
    deepcopy(src[item],options[item])
    }else{
    src[item] = options[item]
    }
    }
    return src;
    }
    var newArr = {};
    var show = deepcopy(newArr,obj)
    console.log(show);
    newArr.b[0] = 10;
    console.log(newArr,obj)

    ---恢复内容结束---

  • 相关阅读:
    大项目之网上书城(五)——主页(End)
    # 大项目之网上书城(四)——主页(下中)
    大项目之网上书城(三)——主页(中)
    大项目之网上书城(二)——主页(上)
    大项目之网上书城(一)——注册页面
    Mycat
    centos7 bash: netstat: 未找到命令
    docker 推送镜像到Harbor错误修改
    Jenkins插件下载镜像加速
    docker镜像加速器
  • 原文地址:https://www.cnblogs.com/guangixn/p/8691014.html
Copyright © 2011-2022 走看看