数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝。

浅拷贝

复制的对象和原始对象属性相关联。事实上,如果对象的任何字段被其他对象引用,则它们共享相同的内存地址。

深拷贝

与浅拷贝不同,深拷贝复制对象的所有属性,并且为新对象分配新的内存地址,我们对新对象的操作不会影响到原对象,看起来就像是将原对象所有的东西都重新复制出来一份。

数据类型

JavaScript中的数据类型分为原始数据类型和复合数据类型。

数值,字符串,布尔值,undefined,null为原始数据类型,而数组和对象则是复合类型。

原始数据进行复制克隆的时候,永远都是新的副本,不会和原来数据进行关联,而复合数据进行浅拷贝的时候,只是分配值的引用。

创建深拷贝

对于克隆对象,如果我们想要进行深拷贝,那么我们经常使用的方法就是JSON.parse()和JSON.stringify()。

数组Map,ForEach和Slice

对于普通的一维数组,函数Map,ForEach,Slice都提供深拷贝的功能,但是对于嵌套数组,这些函数对于内部数组的处理不提供深拷贝的功能。

总结

Object.assign和Object.create都可以进行对象的复制。

使用assign方法时,我们必须确保对象至少复制第二个参数。通常你只会传递一个空对象作为第一个参数。它不提供类似于扩展运算符的完整拷贝。

使用create方法时,现有对象作为新创建对象的原型创建一个新对象。现有对象作为原型可用,从而使所有属性都可用于新对象。但就复制而言,它提供了部分深复制,如分配和扩展运算符。

在 JavaScript 中复制对象的唯一陷阱是嵌套值。

详谈Javascript中的深拷贝和浅拷贝相关推荐

  1. vb.net中递归退到最外层_面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝...

    " 点个关注,养成习惯,带你python爬虫的过程中学习前端 " JavaScript中的深拷贝和浅拷贝是前端面试中频繁被问到的一道题, 于是我也自己去查阅了一些资料, 然后动手敲 ...

  2. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  3. Javascript中的深拷贝和浅拷贝

    文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类 ...

  4. 低门槛彻底理解JavaScript中的深拷贝和浅拷贝

    在说深拷贝与浅拷贝前,我们先看两个简单的案例: //案例1 var num1 = 1, num2 = num1; console.log(num1) //1 console.log(num2) //1 ...

  5. python中的深拷贝与浅拷贝

    浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...

  6. C语言中的深拷贝和浅拷贝

    http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_N ...

  7. python中关于深拷贝和浅拷贝的详解

    python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...

  8. js中的深拷贝和浅拷贝区别

    js中的深拷贝和浅拷贝与值传递和引用传递有着些许的关联,都是根据堆栈中数据的储存来传递数据. 下面主要说一下我对深拷贝和浅拷贝的理解: 简单举个例子来说明:当我们声明一个a变量并且赋值,并且让b等于a ...

  9. JavaScript ES6中的深拷贝和浅拷贝

    今天在做Vue项目时,遇到了涉及到对象展开运算符"..."是深拷贝还是浅拷贝的问题,在问答里看到了这篇回答,由于无法转载,在这里记录一下. 先来了解下,浅拷贝和深拷贝各自的含义: ...

最新文章

  1. 一口气用 Python 写了13个小游戏,摸鱼达人!
  2. 数据库物理文件 mysql_MYSQL数据库-物理文件
  3. “清华数为”工业时序数据库IoTDB与DWF应用开发寒假师资培训圆满结束
  4. 乱谈管理(优秀部门经理的职业素质)
  5. Matlab系统信息、系统命令和跨平台
  6. 如何使用charles对Android Https进行抓包
  7. python语言安装-下载和安装Python语言
  8. 使用git推送代码到开源中国以及IDEA环境下使用git
  9. Spring Boot 数据国际化
  10. HTTP协议从入门到大牛,初识HTTP协议(学习笔记)
  11. 瑞克·李特的追寻 正是我们所需要做的!中国
  12. CNVD和CNNVD披露漏洞教程(个人申报)
  13. 一个简单的网页设计HTML5作业
  14. 计算机忘记网络,忘记密码后如何查看电脑无线网络密码
  15. python学习之数据爬取及其可视化分析(一)
  16. 7个等级 容灾等级_容灾备份的柒个国际标准等级(一)
  17. C++ 数组名a、数组名取地址a、数组首地址a[0]、数组指针*p
  18. php的表达爱意的一句代码,一句表达爱意的古词 最能表达爱的一句话
  19. linux中ls-f的用法,ls命令--Linux命令应用大词典729个命令解读
  20. stegsolve使用参考

热门文章

  1. 作为一名准程序员,谈一下现实和未来
  2. 小甲鱼关于push,pop指令的一个编程题
  3. windows10+Python3-如何安装numpy和matplotlib包
  4. 高速上车辆追尾无法移动 众人齐力抬车温暖归途
  5. Centos7安装DockerCE
  6. Java学习提升体系结构
  7. day23:shell基础介绍 alias及重定向
  8. 避免沦为“人工智障”,机器人还需找对语音交互的“打开方式”
  9. JAVA泛型的基本使用
  10. 洛谷——1115 最大子段和(区间DP)