当前位置: 首页 > news >正文

浅谈js中的深拷贝和浅拷贝

深拷贝和浅拷贝是什么?

浅拷贝的堆内存地址指的是同一个,即只拷贝第一层,深层的引用值只拷贝地址,

而深拷贝则会拷贝所有内容

通俗的来讲就是浅拷贝只会拷贝原对象的属性,但是不会根据原对象属性的变化而变化,

而深拷贝拷贝的数据则是会根据原对象改变而改变

实现案例

浅拷贝实现思路

1.首先判断拷贝的参数是否为对象;

2.生成新的变量,新变量是数组还是对象取决于传的参数是数组还是对象;

3.遍历它,然后通过hasOwnProperty判断是不是他自己的属性,是就将其赋值给要return的数组;

具体代码

可以看出浅拷贝并没有拷贝出d的属性

      let obj = { a: 1, b: 2, c: 3 }; //测试对象
      function copy(obj) {
        // 判断拷贝的参数是否为对象
        if (typeof obj !== "object" || obj === null) {
          console.log("该数据不是一个对象");
          return false;
        }
        // 生成新的变量,生成新变量是数组还是对象取决于obj是数组还是对象
        let newObj = obj instanceof Array ? [] : {};
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
          }
        }
        return newObj;
      }
      let newobj = copy(obj);
      obj.d = 4;
      console.log(newobj);//{a: 1, b: 2, c: 3}

深拷贝实现思路

1.首先判断拷贝的参数是否为对象;

2.生成新的变量,新变量是数组还是对象取决于传的参数是数组还是对象;

3.遍历它,然后通过hasOwnProperty判断是不是他自己的属性,是就将其赋值给要return的数组;

4.使用递归实现深拷贝

具体代码

使用深拷贝可以看出原对象的d属性也被拷贝了出来

    let obj = { a: 1, b: 2, c: 3 }; //测试对象      
    function deepCopy(obj) {
         // 判断拷贝的参数是否为对象
        if (typeof obj !== "object" || obj === null) {
          console.log("该数据不是一个对象");
          return obj;
        }
        // 生成新的变量,生成新变量是数组还是对象取决于obj是数组还是对象
        let newObj = obj instanceof Array ? [] : {};
        for (let key in obj) {
          if (obj.hasOwnProperty(key)) {
            newObj[key] = deepCopy(obj[key]);
          }
        }
        return newObj;
      }
      let deepObj = deepCopy(obj);
      console.log(deepObj); //{a: 1, b: 2, c: 3, d: 4}

不过这个代码有bug就是不能识别Date等特殊对象(目前还未修复)

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

csdn文章推荐受影响解决办法10个字10行

相关文章:

  • Hbase-3-4-Hbase读写数据流程
  • Oracle——常用的几种函数(含案例)
  • 【Linux】多线程 —— 线程概念 | 线程控制
  • windows10创建ssh git gitee使用公钥私钥【自留收藏】
  • 微信搜题接口API功能
  • YBTOJ 树状数组 二进制
  • 无胁科技-TVD每日漏洞情报-2022-8-30
  • Java8 特性(一):函数、Lambok、Stream
  • 定时器(Quartz)
  • 神经网络实现线性回归,神经网络是回归算法吗
  • MFC调用VLC库播放中文路径导致崩溃的问题
  • 微信公众号搜题功能接口
  • 5.java不同方法的区别(构造方法,实例方法,类方法,static关键字)
  • 无胁科技-TVD每日漏洞情报-2022-8-31
  • 力扣-221题 最大正方形(C++)- dp
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Angular数据绑定机制
  • CEF与代理
  • DOM的那些事
  • GraphQL学习过程应该是这样的
  • IDEA 插件开发入门教程
  • Mysql5.6主从复制
  • PHP 的 SAPI 是个什么东西
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • webpack4 一点通
  • 前端工程化(Gulp、Webpack)-webpack
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深入浅出webpack学习(1)--核心概念
  • 推荐一个React的管理后台框架
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • const的用法,特别是用在函数前面与后面的区别
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Linux·i2c驱动架构​
  • #微信小程序:微信小程序常见的配置传值
  • $NOIp2018$劝退记
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (转)一些感悟
  • .naturalWidth 和naturalHeight属性,
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net 获取url的方法
  • .Net6使用WebSocket与前端进行通信
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET下ASPX编程的几个小问题
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @SentinelResource详解
  • [Angular 基础] - 数据绑定(databinding)
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ] 2044: 三维导弹拦截
  • [CCIE历程]CCIE # 20604