看这个文章之前,看一下这个作者的文档,讲了一下堆和栈、基本数据和引用数据,比较基础的一些东西:https://www.cnblogs.com/echolun/p/7889848.html

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

浅拷贝:复制对象的时候,只对第一层键值对进行独立的复制

简单的实现如下  es5

// 浅拷贝实现
function shadowCopy(target, source){
if( !source || typeof source !== 'object'){
return;}// 这个方法有点小trick,target一定得事先定义好,不然就不能改变实参了。// 具体原因解释可以看参考资料中 JS是值传递还是引用传递
if( !target || typeof target !== 'object'){
return;}  // 这边最好区别一下对象和数组的复制
for(var key in source){
if(source.hasOwnProperty(key)){target[key] = source[key];}}
}

es6

注意,在属性拷贝过程中可能会产生异常,比如目标对象的某个只读属性和源对象的某个属性同名,这时该方法会抛出一个 TypeError 异常,拷贝过程中断,已经拷贝成功的属性不会受到影响,还未拷贝的属性将不会再被拷贝。

注意, Object.assign 会跳过那些值为 null 或 undefined 的源对象。

Object.assign(target, ...sources)

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }

深拷贝

递归属性遍历

es5

一般来说,在JavaScript中考虑复合类型的深层复制的时候,往往就是指对于Date、Object与Array这三个复合类型的处理。我们能想到的最常用的方法就是先创建一个空的新对象,然后递归遍历旧对象,直到发现基础类型的子节点才赋予到新对象对应的位置。不过这种方法会存在一个问题,就是JavaScript中存在着神奇的原型机制,并且这个原型会在遍历的时候出现,然后原型不应该被赋予给新对象。那么在遍历的过程中,我们应该考虑使用hasOenProperty方法来过滤掉那些继承自原型链上的属性:

function clone(obj) {var copy;// Handle the 3 simple types, and null or undefinedif (null == obj || "object" != typeof obj) return obj;// Handle Dateif (obj instanceof Date) {copy = new Date();copy.setTime(obj.getTime());return copy;}// Handle Arrayif (obj instanceof Array) {copy = [];for (var i = 0, len = obj.length; i < len; i++) {copy[i] = clone(obj[i]);}return copy;}// Handle Objectif (obj instanceof Object) {copy = {};for (var attr in obj) {if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);}return copy;}throw new Error("Unable to copy obj! Its type isn't supported.");
}

利用JSON深拷贝

对于一般的需求是可以满足的,但是它有缺点。下例中,可以看到JSON复制会忽略掉值为undefined以及函数表达式。

JSON.parse(JSON.stringify(obj));

ES5、ES6深拷贝、浅拷贝相关推荐

  1. ES6 深拷贝_JS基本数据类型和引用数据类型的区别及深浅拷贝

    1.栈(stack)和堆(heap) stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动释放 2.数据类型 JS分两种数据类型: 基本数据类型:Numb ...

  2. Js Array数组ES5/ES6常用方法

    Js Array数组ES5/ES6常用方法 1.栈方法(先进后出) push():在数组的最后一项后追加值(参数:可以为多个值或数组) 返回:数组的长度,改变了原数组. var a=[1,2,3] a ...

  3. java深拷贝和浅拷贝_Java 深拷贝浅拷贝 与 序列化

    一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会 ...

  4. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{private int id;private String name ...

  5. JavaScript get set方法 ES5 ES6写法

    title: JavaScript get set方法 ES5/ES6写法 date: 2018-05-07 10:38:50 tags: 前端 categories: 前端 网上鲜有get和set的 ...

  6. 原型模式与深拷贝浅拷贝

    原型模式与深拷贝浅拷贝 原型模式 Java中的原型模式 简单的例子 浅拷贝 深拷贝 效率比较 JMH测试样例 测试结果 原型模式 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或 ...

  7. ES6深拷贝与浅拷贝

    小感在前 React学习与开发过程要经历一个相当长的准备阶段,此前看阮一峰老师的文章中,他就特别提到这一点.但是,由于React框架或者说是一种优秀的前端架构实在太诱人,所以,掌握这项技术所涉及的技术 ...

  8. ES6中展开运算符的深拷贝浅拷贝理解(ElementUI表格点击编辑,模态框内容与表格数据一起变的问题)

    项目中遇到的问题: 在elementui中表格点击按钮传值的时候,通过bus中的$emit传对象,在弹出的模态框中用bus的$on接收对象,然后对传的对象进行改变,结果发现改变了原表格的数据. 然后就 ...

  9. ES6 深拷贝_你别自以为是:ES6误区 之 Object.assign()、const

    文/北妈 阅读本文需要 2.3分钟 一 很久没发技术文,今天北妈在新开一个技术系列:"别自以为是,1分钟走出JS常见误区",里面我会每期挑选几个常见基础属性,讲一讲里面最容易被人忽 ...

最新文章

  1. 2022-2028年中国芯片封测行业深度调研及投资前景预测报告(全卷)
  2. frame 2 opencv mat
  3. python项目实战:最简单的图片转字符画
  4. Markdown 语法及常用资料收集--CheatSheet
  5. SpringBoot的配置详解application
  6. 简单数据恢复菜鸟教程 (转)
  7. leetcode 116 --- 填充每个节点指向最右节点的next指针
  8. 在Mac电脑上如何对 Brotli格式进行压缩与提取
  9. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类
  10. C# A potentially dangerous 问题解决
  11. 常见批处理作业调度算法
  12. Mathematics Base - 期望、方差、协方差、相关系数总结
  13. 微信支付商户号和企业付款到零钱开通方法
  14. 解决:WPS文字行末是英文单词时自动换行问题
  15. python打造批量关键词排名查询工具
  16. 微信公众平台流量主单日广告收入最高达5万元 羡煞偶们
  17. Java调用Mysql
  18. 二年级的女儿用计算机算算术,一年级的孩子一分钟口算多少题才算能达标?
  19. Quartus II 9.0编译时出现Error: Current license file does not support the EP2C35F484C8 device的问题
  20. CSS3 filter grayscale 将整个界面变为黑白灰色调

热门文章

  1. 老师说,最怕的就是你觉得你很牛逼~
  2. python json是什么_Python解析Json数据
  3. idea修改背景为护眼背景模式、淡黄色、淡绿色等,内附多张纯色背景图片供使用
  4. 小游戏在提升用户留存方面的作用
  5. 钉钉小程序h5微应用企业内部应用开发
  6. php微信红包雨效果,【微信红包雨】 原来红包还可以这么玩!你造吗?
  7. 泡泡玛特的泡泡终于破了
  8. MySQL 简单了解B+树
  9. Aspose.cells导出Excel合并行单元格(Datatable)
  10. 关于【星图地球开发者平台】里地球组件的基本使用方法