一.数据类型

数据分为基本数据类型和引用数据类型

基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)

引用数据类型(Object[Array属于Object])

基本数据类型的特点:直接存储在栈(stack)中的数据
引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里

引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。

二.深拷贝与浅拷贝

1.浅拷贝

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

1.浅拷贝是按位拷贝对象,它会创建一个新对象,有着原始对象属性值的一份精确拷贝。
2.如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

2.深拷贝

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”(不是分支)

1.拷贝第一层级的对象属性或数组元素
2.递归拷贝所有层级的对象属性和数组元素
深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。

三.js实现深拷贝和浅拷贝

1.浅拷贝

    <script>var obj = {id: 1,name: 'andy',msg: {age: 18,color: ['pink', 'blue']}};var o = {}for (var k in obj) {// k 是属性名 obj[k] 是属性值o[k] = obj[k];}console.log(o);o.msg.age = 20;console.log(obj);// Object.assign(o, obj) // 浅拷贝语法糖// console.log(o);// o.msg.age = 20;// console.log(obj);</script>

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存,因此如果修改其中一个对象,另一个也会跟着改变。

2.深拷贝

    <script>var obj = {id: 1,name: 'andy',msg: {age: 18},color: ['pink', 'red']};var o = {};// 用递归的方式完成深拷贝// 封装函数function deepCopy(newobj, oldobj) {// 遍历oldobj的属性名for (var k in oldobj) {// 判断属性属于哪种数据类型// 1.获取属性值 oldobj[k]var item = oldobj[k];// 2.判断是否属于数组(因为数组也属于对象,所以必须先判断数组)if (item instanceof Array) {newobj[k] = []; // (1)先给newobj添加一个属性k,同oldobj里的kdeepCopy(newobj[k], item) // (2)再用oldobj[k]赋值给newobj[k]} else if (item instanceof Object) {// 3.判断是否属于对象newobj[k] = {};deepCopy(newobj[k], item)} else {// 4.属于简单数据类型newobj[k] = item}}}deepCopy(o, obj)console.log(o);</script>

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会影响到原对象。

参考: 浅拷贝与深拷贝的区别(详解)_Mark sheng的博客-CSDN博客_浅拷贝深拷贝

js实现浅拷贝和深拷贝相关推荐

  1. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  2. 【js】浅拷贝与深拷贝

    一.理解 1.浅拷贝:只是拷贝一层,更深层次对象级别的只拷贝了地址. 浅拷贝的时候如果数据是基本数据类型,那么就如同直接赋值那种,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么对于浅拷贝而言 ...

  3. 小tips:JS之浅拷贝与深拷贝

    浅拷贝: function extendCopy(p) {var c = {};for (var i in p) {c[i] = p[i];}return c; } 深拷贝: function dee ...

  4. js 对象浅拷贝和深拷贝

    var model={name:"boy",age:13}; var CopyModel=model; console.log(CopyModel.name); model.nam ...

  5. JS中浅拷贝和深拷贝的使用,深拷贝实现方法总结

    1.浅拷贝:两个对象经过拷贝后虽然具有相同的属性,但是他们都指向同一个内存空间.操作会引起引用,同一地址的变量一起改变. let a = {x: 1} let b = a b.x = 2 consol ...

  6. js对象浅拷贝与深拷贝

    一.简介    浅拷贝是拷贝一层,如果数据是基本数据类型,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么只能拷贝其引用,对象的改变会反应到拷贝对象上.    深拷贝是拷贝多层,每一层的数据都 ...

  7. js关于浅拷贝、深拷贝,数组的深拷贝

  8. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  9. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

最新文章

  1. c 中ajax不起作用,Jquery AJAX調用:$(this)在成功后不起作用
  2. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...
  3. python界面开发工具免费_Python程序员必备的四款开发工具
  4. java程序打包为jar_将Java应用程序打包为一个(或胖)JAR
  5. Magento: 解决 Bootstrap 3 与prototype并用的时候, 下拉菜单消失的问题 Bootstrap 3 dropdown menu dis...
  6. ExtJs2.0学习系列(4)--Ext.FormPanel之第一式
  7. python-9:nonlocal,指定上一级变量
  8. 用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动
  9. 光线跟踪的几种常见求交运算
  10. 雪花算法详解及存在问题
  11. java 多文字水印_Java如何给Word文档添加多行文字水印
  12. Discussion 2
  13. 《PyTorch机器学习从入门到实战》 例程(PyTorch1.2版本可用)
  14. 数字图像处理与Python实现-图像几何变换-图像金字塔
  15. 报表工具使用教程-FineReport决策报表导出Plus
  16. ppt文件服务器权限破解,怎么解开PPT文档的权限保护?
  17. 前端数组如何传到后台
  18. 如何在文字识别软件ABBYY中创建区域模板,处理大量相同内容?
  19. mysql prefix_mysql改变innodb_large_prefix
  20. 何为非侵入式负荷分解

热门文章

  1. 电脑上测试软件打不开,电脑双击文件word软件打不开怎么办?
  2. php简单的检测文件名后缀案例
  3. GCC Arm 12.2编译提示 LOAD segment with RWX permissions 警告
  4. wordcloud模块
  5. 组合逻辑电路和时序逻辑电路区别
  6. 什么是装箱?什么是拆箱?
  7. 计算机组成原理学习笔记:奇偶校验码
  8. 什么是梯度消失和梯度爆炸
  9. 初级会计可以用计算机,初级会计考试能带计算机吗?还不知道速看!
  10. 跟我学UDS(ISO14229) ———— NRC码