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)

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

  • 相关阅读:
    jmeter的beanshell脚本编写
    基于 Flask 的简易 Mock 平台
    mock-server
    linux环境jmeter- java环境安装配置
    服务器监控环境搭建 telegraf+influxdb+grafana框架
    聚类算法:凝聚层次聚类
    python中cursor操作数据库
    python中if __name__ == '__main__': 的解析
    python连接mysql数据库
    Python3.5,flask在命令行执行 [python] view plain copy import pymysql 连接mysql数据库MySQLdb
  • 原文地址:https://www.cnblogs.com/guangixn/p/8691014.html
Copyright © 2011-2022 走看看