• 【深拷贝和浅拷贝】


    浅拷贝

    在这里插入图片描述

    浅拷贝,指的是创建新的数据,这个数据有着原始数据属性值的一份精确拷贝
    如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址
    在JavaScript中,存在浅拷贝的现象有:

    • Object.assign
    • Array.prototype.slice(), Array.prototype.concat()
    • 使用拓展运算符实现的复制

    深拷贝

    在这里插入图片描述

    深拷贝开辟一个新的栈,两个对象属完成相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

    常见的深拷贝方式有:

    • _.cloneDeep()
    • jQuery.extend()
    • JSON.stringify()
    • 手写循环递归

    JSON.parse(JSON.stringify)为什么可以实现深拷贝?

    • 使用JSON.stringify将对象序列化,转成字符串后,存储在硬盘上,在通过JSON.parse()反序列化,将字符串转成对象

    • 实现深拷贝的缺点?

      • 会将JS对象中的时间对象转化为字符串 会将JS对象中的RegExp、Error对象转化为空对象 会将JS对象中的function、undefined、Symbol丢失 会将JS对象中的NaN、Infinity和-Infinity转化为null 会将JS对象中有构造函数生成的对象的 constructor 丢失 如果JS对象存在循环引入将无法实现深拷贝

    通过JSON.stringify实现深拷贝有几点要注意

    1. 拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失
    2. 无法拷贝不可枚举的属性,无法拷贝对象的原型链
    3. 拷贝Date引用类型会变成字符串
    4. 拷贝RegExp引用类型会变成空对象
    5. 对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null
    6. 无法拷贝对象的循环应用(即obj[key] = obj)

    总结

    1. 深拷贝递归地复制新对象中的所有值或属性,而拷贝只复制引用。
    2. 在深拷贝中,新对象中的更改不会影响原始对象,而在浅拷贝中,新对象中的更改,原始对象中也会跟着改。
    3. 在深拷贝中,原始对象不与新对象共享相同的属性,而在浅拷贝中,它们具有相同的属性。
  • 相关阅读:
    Kotlin--1.基础语法
    osqp的原理ADMM(交替方向乘子法)理解
    给cmd控制台程序 套壳 美化
    基于MxNet实现目标检测-YoloV4【附部分源码及模型】
    流量录制与回放在vivo的落地实践
    Dubbo源码理解
    【浏览器】端数据库存储方案----indexDB、localForage
    JVM学习——6——JVM常用命令
    神仙级Python入门教程(非常详细),从零基础入门到精通,从看这篇开始
    在css3中如何添加圆角边框、盒子阴影以及文字阴影
  • 原文地址:https://blog.csdn.net/qq_40992225/article/details/126336626