对象在引用的时候引用的是对象的地址,所以导致如果修改其中一个对象,就会对其他引用这个地址的对象进行修改,这种结果并不是我们想要的,这个时候我们就要用到深拷贝和浅拷贝去解决这个问题了。

var a = {name: 'test'
};
var b = a;
a.name = 'test1';
console.log(b); // {name: 'test1'}
复制代码

浅拷贝

  • Object.assign

Object.assign 只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址,所以并不是深拷贝。

var a = {name: 'test'
};
var b = Object.assign({}, a);
a.name = 'test1';
console.log(b); // {name: 'test'}
复制代码
  • ...扩展运算符

我们可以通过扩展运算符实现浅拷贝。

var a = {name: 'test'
};
var b = { ...a };
a.name = 'test1';
console.log(b); // {name: 'test'}
复制代码

深拷贝

最简单的深拷贝可以通过 JSON.parse(JSON.stringify(obj)) 实现。

let a = {age: 1,jobs: {first: 'FE'}
};
let b = JSON.parse(JSON.stringify(a));
a.jobs.first = 'native';
console.log(b.jobs.first); // FE
复制代码

但是如果对象中包含 undefined,Symbol,序列化函数,循环引用对象这几种情况的话,这个方法就不起作用了。

let a = {age: undefined,sex: Symbol('male'),jobs: function() {},name: 'yck'
};
let b = JSON.parse(JSON.stringify(a));
console.log(b); // {name: "yck"}
复制代码

深拷贝我们还可以使用 MessageChannel,这个方法可以处理 undefined 和循环引用对象。

function structuralClone(obj) {return new Promise(resolve => {const { port1, port2 } = new MessageChannel();port2.onmessage = ev => resolve(ev.data);port1.postMessage(obj);});
}var obj = {a: 1,b: {c: 2}
};obj.b.d = obj.b;// 注意该方法是异步的
// 可以处理 undefined 和循环引用对象
const test = async () => {const clone = await structuralClone(obj);console.log(clone);
};
test();
复制代码

最简单的我们还可以使用 lodash 的深拷贝方法。

如果想自己实现一个深拷贝,其实需要考虑多个边界情况,比较复杂,参考网上的内容,实现一个简易版的深拷贝。

function deepClone(obj) {function isObject(o) {return (typeof o === 'object' || typeof o === 'function') && o !== null;}if (!isObject(obj)) {throw new Error('非对象');}let isArray = Array.isArray(obj);let newObj = isArray ? [...obj] : { ...obj };Reflect.ownKeys(newObj).forEach(key => {newObj[key] = isObject(obj[key]) ? deepClone(obj[key]) : obj[key];});return newObj;
}let obj = {a: [1, 2, 3],b: {c: 2,d: 3}
};
let newObj = deepClone(obj);
newObj.b.c = 1;
console.log(obj.b.c); // 2
复制代码

更清晰的认识对象——深拷贝与浅拷贝相关推荐

  1. java map to map 拷贝_java复制Map 对象(深拷贝和浅拷贝)

    java复制Map 对象(深拷贝和浅拷贝) java复制Map 对象(深拷贝和浅拷贝) 2. 通过 putAll()方法能实现浅拷贝和深拷贝, 使用Map对象只能实现浅拷贝 public static ...

  2. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  3. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  4. PHP中对象的深拷贝与浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...

  5. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  6. python类对象赋值_Python对象赋值、浅拷贝、深拷贝

    Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...

  7. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  8. 深入浅出解释深拷贝、浅拷贝、对象拷贝、引用拷贝原理和应用

    拷贝总体上分为引用拷贝和对象拷贝. 1. 引用拷贝 创建一个指向对象的引用变量的拷贝. public class QuoteCopy {public static void main(String[] ...

  9. java对象深克隆_JAVA中对象的克隆及深拷贝和浅拷贝

    使用场景: 在日常的编程过程 中,经常会遇到,有一个对象OA,在某一时间点OA中已经包含了一些有效值 ,此时可能会需一个和OA完全相对的新对象OB,并且要在后面的操作中对OB的任何改动都不会影响到OA ...

最新文章

  1. idea 连接 mysql_IDEA 与MySQL连接问题
  2. 得出来的视差图左边有黑色补上原图_「PS教程」Photoshop使用通道快速抠图的详细教程...
  3. 孤荷凌寒自学python第八十一天学习爬取图片1
  4. Anaconda 安装 Python 库(MySQLdb)的方法
  5. 360发布穿戴设备“儿童卫士”手环
  6. 数据挖掘算法(logistic回归,随机森林,GBDT和xgboost)-腾讯云社区
  7. ArcGIS API for Silverlight之配准JPG图片地图文字倾斜解决方案
  8. 【转】LPCTSTR,LPWSTR, PTSTR, LPTSTR区别
  9. 2008是中国的奥运年
  10. TensorFlow infogan 生成 mnist 数据集
  11. AMAZINGIC晶焱CAN 总线收发器一致性测试
  12. java bzip2 压缩,Java bzip2压缩与解压缩工具类
  13. win10任务栏透明+变窄+免安装
  14. ESlint语法检测工具
  15. 如何debug preloader bootup time 问题以及开机过程中preloader慢抓取 preload模块开机log
  16. 用python制作一个今天吃什么的代码
  17. [CodeForces 332B]Maximum Absurdity[DP]
  18. 用Python实现一个轮盘抽奖小游戏~
  19. 华为首部鸿蒙,华为首部鸿蒙手机P50即将发布
  20. 计算机软件著作权怎么申请登记

热门文章

  1. 如何与您的经理和上层人员进行有效沟通
  2. SAP MM 计量单位EA的数量可以有小数点
  3. 引燃AI社区,OpenAI新模型打破自然语言与视觉次元壁
  4. 神经进化:一种不一样的深度学习
  5. 破解自动机器学习的黑匣子
  6. GAN简介及其常见应用
  7. 如何在算法交易中使用AI?摩根大通发布新版指南
  8. 外媒评李开复的《AI·未来》:四大浪潮正在席卷全球
  9. 干货丨【看图识算法】这是你见过最简单的 “算法说明书”
  10. 观点丨麦肯锡:怎么理解“人工智能最大挑战与机会”