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)

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

  • 相关阅读:
    资源文件 -- 初级应用篇
    Dephi中资源文件的应用
    VC++ 中使用内存映射文件处理大文件
    Delphi中正常窗口的实现
    让程序只运行一个实例
    多条明细(绑定到一个字段)汇总
    在更新之后最好有个判断 看是否更新上 编码码自动生成
    Delphi中有序型
    使用powerDesign画er图 并用 Database --->Generate Database ---> Genarate Script一次性将表结构的脚本导出来。
    .Net中的水晶报表
  • 原文地址:https://www.cnblogs.com/guangixn/p/8691014.html
Copyright © 2011-2022 走看看