对象的深拷贝与浅拷贝(同样适用于数组)

  1. JSON方法
const obj1={a:6,b:undefined,c:[1,3,4],d:()=>{}}const obj2=JSON.parse(JSON.stringify(obj1))obj2.a=0;obj2.c[0]=2console.log('obj1: ',obj1)console.log('obj2: ',obj2)

缺点:数据值为undefined或数据类型为function的情况下无法复制

2.Object.assign方法

const obj2=Object.assign({},obj1);obj2.a=0;obj2.c[0]=2console.log('obj1: ',obj1)console.log('obj2: ',obj2)

缺点:只能拷贝一级属性,二级属性及更深层次的属性仍然是浅拷贝

3. 扩展运算符

const obj2={...obj1}obj2.a=0;obj2.c[0]=2console.log('obj1: ',obj1)console.log('obj2: ',obj2)

缺点:只能拷贝一级属性,二级属性及更深层次的属性也是浅拷贝

4. 递归(比较完美的解决方案)

const obj2 = cloneDeep(obj1)obj2.a = 0;obj2.c[0] = 2console.log('obj1: ', obj1)console.log('obj2: ', obj2)function cloneDeep(obj) {let newObj = Array.isArray(obj) ? [] : {}for (let key in obj) {if (obj[key] && typeof obj[key] === "object") {newObj[key] = cloneDeep(obj[key])} else {newObj[key] = obj[key]}}return newObj}

js 深拷贝与浅拷贝相关推荐

  1. js深拷贝和浅拷贝的区别

    js深拷贝和浅拷贝的区别 如何来区分深拷贝和浅拷贝,其实简单,例如: 就是我声明一个obj对象,如何让var a直接等于obj,然后有在obj新增个fun,此时的a也会随着新增个fun,相同a新增数据 ...

  2. js深拷贝和浅拷贝对数组的影响_浅拷贝与深拷贝(JavaScript)

    一.预备知识 ECMAScript变量包含两种不同数据类型的值:基本数据类型和引用数据类型. 基本数据类型:名值存储在栈内存中: 引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引 ...

  3. js深拷贝和浅拷贝对数组的影响_javaScript中的深拷贝和浅拷贝

    今天来整理一下js中的深浅拷贝 深浅拷贝 简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着A一起变了,说明这是浅拷贝,如果B没有变,那就是深拷贝. 看例题 //案例1var a1 ...

  4. 详解JS深拷贝与浅拷贝

    深拷贝与浅拷贝 深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存:深拷贝会另外创建一个一模一样的对象,新对象跟原对象 ...

  5. js深拷贝和浅拷贝对数组的影响_javascript之浅拷贝与深拷贝

    好久没提笔写文章了,之前忙得喘不过气,过年回家也无心学习.年后回来后,调整好状态,准备把js基础重新过一遍. 正文从此开始: 之所以写这篇文章是因为Leader最近在面试,回来和我们数落了一通,问一个 ...

  6. js深拷贝,浅拷贝的解析以及解决方案

    深.浅拷贝 简单来说,浅拷贝简单的处理简单数据时候就很ok 到那时遇到复杂数据类型就可能有点吃了,比如数组,你赋值了个另一个变量,这样会导致一个变量改,另一个数据也会发生改变,这或许导致很危险的东西. ...

  7. js 深拷贝,浅拷贝

    blog.csdn.net/linusc/arti- 参考此文更有帮助 ---- 如果进行浅拷贝,会使得数据出现一改全改的现象 所以对对象进行深拷贝,才不会出现改一个而把其他变量也改了的效果. 具体的 ...

  8. js 深拷贝 和 浅拷贝

    1.  ...运算符  (浅拷贝) let obj = {a:1,b:2}; let obj2 = {...obj}; obj.a=3 obj //{a: 3, b: 2} obj2 //{a: 1, ...

  9. js深拷贝和浅拷贝对数组的影响_JS基础——深拷贝与浅拷贝

    浅拷贝 对象的浅拷贝 Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,它将返回目标对象. var target = { name:"rlxu&qu ...

最新文章

  1. 第一课.Linux系统的介绍与ubuntu虚拟机安装
  2. DbVisualizer 数据库连接工具:添加数据库驱动方法。dbvis搜索不到驱动文件夹下的驱动解决方法
  3. 通俗大白话来理解TCP协议的三次握手和四次分手
  4. es聚合查询与多维度数据统计
  5. mvd没什么每次参数双都多一个逗号_必看!PostgreSQL参数优化
  6. P4475 巧克力王国(KDTree)
  7. Java 死锁及解决方法
  8. python3,使用sys.setdefaultencoding('utf-8'),编译时报错
  9. 前端安全问题的解决方法
  10. 2000坐标系与现行坐标系的关系及采用2000坐标系之后的一些变化
  11. 项目经理面试的一些问题讨论
  12. 按键精灵卡屏检测判断窗口是否无响应或卡屏
  13. xHCI1.1-TRB Ring
  14. 图扑数字孪生青岛城轨,赋能智慧交通低碳发展
  15. C++软件工程师的发展前景如何
  16. oracle 查询本年12月,Oracle查询1-12月数据
  17. 软考哪个含金量更高?
  18. 数据库sql嵌套查询
  19. python连接redis_Python连接Redis
  20. java 对接 PayPal 或者 Stripe 支付,订阅

热门文章

  1. VIM删除一行或者多行内容具体方法
  2. jQuery的三种遍历循环
  3. 动物class类图 php,UML系列——类图class
  4. buildroot下载软件包太慢/失败
  5. zaker在android内容好少,ZAKER - 领略阅读之美 - Android 应用 - 【最美应用】
  6. 博途1200PLC由丝杠位移速度计算电机转速(moveVel_TO_motorSpeed功能块)
  7. 富人和穷人的12大经典差异
  8. 产品经理懂点技术之:4K/8K
  9. 6月13日王者体验服服务器未响应,王者荣耀6月13号体验服更新情况详解及段位继承新规则...
  10. 北邮CSAPP第三章之数据格式与程序编码