• 对象的深浅拷贝


    1.为什么会产生深浅拷贝?

    首先我们需要知道新建一个对象的流程:①:对象属于引用类型的,所以浏览器会为其开辟一个新的内存空间,并为它分配一个16进制的地址 ;②:按照一定的顺序,把对象的键值对存储到内存空间;③:把开辟的内存地址赋值给变量(或事件),以后变量就通过地址找到内存空间,然后进行操作。

    举例子:

    var obj ={
      name:'alhh',
      age:'18'
    }
    var obj2 = obj
    obj2.name = 'LQQ'
    console.log(obj.name) //LQQ
    console.log(obj2.name) //LQQ
    //obj和obj2共享一个内存地址 修改了obj2就相当于修改了obj1

    2.浅拷贝例子

    在实际项目中Object.assign(target,...source):可以把多个源对象自身的可枚举的属性拷贝给目标对象,然后返回的是目标对象

    举例子:

    var obj = {
        info:{
        name:'alhh',
        age:'18'
        }
    }  
    var copyObj = Object.assign({},obj) 
    copyObj.info.name='lqq'
    console.log(obj.info.name) //lqq
    console.log(copyObj.info.name) //lqq

    特别注意的是:当object是一层的时候,是深拷贝

    举例子:

    var obj = {
        name:'alhh'
    }
    var copyObj = Object.assign({},obj)
    copyObj.name = 'lqq'
    console.log(obj) //alhh
    console.log(copyObj) //lqq

    在做电商的小程序的时候 有个页面是选择商品的颜色,尺寸,型号等等,就可以采用对象的浅拷贝,思路:把颜色,尺寸抽成一个小组件,然后选中之后向上传值,传值内容是一个对象,属性为value,name,父级接受传过来的值,重点来喽,当用户修改颜色或者尺码的时候,由于对象的浅拷贝,父级接收到的值就是每次修改后的。

    3.深拷贝例子

    在做后台管理系统的时候,采用的是vue+elementui 表格渲染数据之后点击某一栏去编辑,发现编辑框里的内容修改后(还未点确定按钮时候),list列表里面的数据也会即时修改,有点误导用户的感觉,这是由于对象的浅拷贝造成的,于是采用JSON.parse,JSON.stringify就解决了

    JSON.parse(JSON.stringify(editInfo))
    //将传给编辑框的值JSON处理一下

    还有一种方法:手写递归的原理:遍历引用类型的(对象、数组),直到里面都是基本数据类型,然后再去复制

    后期会陆续补充项目中运用到深浅拷贝的例子,欢迎补充~

  • 相关阅读:
    flume采集log4j日志到kafka
    解决spring 事务管理默认不支持SQLException等运行时异常
    基于黑名单的xss过滤器
    VMware创建Linux虚拟机并安装CentOS(三)
    dubbo 常见错误
    Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
    zookeeper工作原理、安装配置、工具命令简介
    VMware创建Linux虚拟机并安装CentOS(二)
    NSPredicate谓词
    IOS网络请求之NSURLSession使用详解
  • 原文地址:https://www.cnblogs.com/alhh/p/10936009.html
Copyright © 2020-2023  润新知