两者的区别:一个对象浅复制后,是深层次的对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会发生改变,而深复制的则是开辟了一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

话不多说,上代码:

// 原始对象
var obj = { a:1, arr: [2,3],say:function(){console.log('hello')},obj1:{arr:[34,55,5],hand:function(){console.log('hand')},obj3:{a:1,take:function(){console.log('take')}}}
};// 开始浅复制
var shallowObj = shallowCopy(obj);// 定义浅复制逻辑
function shallowCopy(src) {var dst = {};for (var prop in src) {if (src.hasOwnProperty(prop)) {dst[prop] = src[prop];}}return dst;
}// 改变复制后的新对象属性值(第一层属性)
shallowObj.a = 2;
shallowObj.arr = [9,8];
shallowObj.say = function(){console.log('world')
}// 打印新对象的及方法
console.dir(shallowObj)
shallowObj.say();  // world// 打印原对象及方法
console.dir(obj);
obj.say();  // hello

结果如图所示:

结论 : 修改新对象的属性值,第一层的属性值的确没有变化,重点来了,我们给第二层以及更深层次的属性复制试试

// 原始对象
var obj = { a:1, arr: [2,3],say:function(){console.log('hello')},obj1:{arr:[34,55,5],hand:function(){console.log('hand')},obj3:{a:1,take:function(){console.log('take')}}}
};// 开始浅复制
var shallowObj = shallowCopy(obj);// 定义浅复制逻辑
function shallowCopy(src) {var dst = {};for (var prop in src) {if (src.hasOwnProperty(prop)) {dst[prop] = src[prop];}}return dst;
}// 改变复制后的新对象的属性值(第二层以及更深层次)
shallowObj.obj1.obj3.take = function(){console.log('shallowObj_take')
}
shallowObj.obj1.hand = function(){console.log('shallowObj_hand')
}// 打印新对象的方法调用
shallowObj.obj1.obj3.take();  // shallowObj_take
shallowObj.obj1.hand();      // shallowObj_hand// 打印原对象的方法调用
obj.obj1.obj3.take();   // shallowObj_take
obj.obj1.hand();     // shallowObj_hand问题出现了:原对象的方法被新对象的修改,而产生变化。
原因是复制的是对象的地址指针,两个属性共同指向一个对象,只要其一发生变化,另一个也随之变化

深拷贝的方法:

1.可以递归递归去复制所有层级属性

// 原始对象
var obj = { a:1, arr: [2,3],say:function(){console.log('hello')},obj1:{arr:[34,55,5],hand:function(){console.log('hand')},obj3:{a:1,take:function(){console.log('take')}}}
};// 深复制逻辑(递归调用)
function deepClone(obj){let objClone = Array.isArray(obj)?[]:{};if(obj && typeof obj==="object"){for(key in obj){if(obj.hasOwnProperty(key)){//判断obj子元素是否为对象,如果是,递归复制if(obj[key] && typeof obj[key] ==="object"){objClone[key] = deepClone(obj[key]);}else{//如果不是,简单复制objClone[key] = obj[key];}}}}return objClone;
}    // 开始深复制
var shallowObj = deepClone(obj);// 改变复制后的新对象的属性值(第二层以及更深层次)
shallowObj.obj1.obj3.take = function(){console.log('shallowObj_take')
}
shallowObj.obj1.hand = function(){console.log('shallowObj_hand')
}shallowObj.obj1.obj3.take();  // shallowObj_take
shallowObj.obj1.hand();      // shallowObj_handobj.obj1.obj3.take();   // take
obj.obj1.hand();     // hand结论:深拷贝后改变对象的属性值,不会影响原始对象的值。

2.除了递归,我们还可以借用JSON对象的parse和stringify

function deepClone(obj){let _obj = JSON.stringify(obj),objClone = JSON.parse(_obj);return objClone
}
let a=[0,1,[2,3],4],b=deepClone(a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

3.除了上面两种方法之外,我们还可以借用JQ的extend方法

$.extend( [deep ], target, object1 [, objectN ] )

deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝

target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。

object1  objectN可选。 Object类型 第一个以及第N个被合并的对象。 


let a=[0,1,[2,3],4],b=$.extend(true,[],a);
a[0]=1;
a[2][0]=1;
console.log(a,b);

谈谈浅拷贝和深拷贝的区别,以及实现的方法相关推荐

  1. Python 赋值、浅拷贝、深拷贝的区别?

    http://songlee24.github.io/2014/08/15/python-FAQ-02/ 在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出 ...

  2. python赋值浅拷贝和深拷贝的区别_python赋值、浅拷贝、深拷贝区别

    在写Python过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<Py ...

  3. 详细解析赋值、浅拷贝和深拷贝的区别

    详细解析赋值.浅拷贝和深拷贝的区别 一.赋值(Copy) 赋值是将某一数值或对象赋给某个变量的过程,分为下面 2 部分 基本数据类型:赋值,赋值之后两个变量互不影响 引用数据类型:赋址,两个变量具有相 ...

  4. 彻底理解Python中浅拷贝和深拷贝的区别

    目录 前言 1. 浅拷贝和深拷贝的概念 2. is和==的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 ...

  5. python中浅拷贝和深拷贝的区别_Python中浅拷贝和深拷贝的区别

    Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝 ...

  6. 前端面试:浅拷贝和深拷贝的区别?

    前些天发现了一个巨牛的人工智能学习博客,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转 那么大家晚上好,我是今天晚上的主讲老师,我是兔哥. 我们在面试中经常会被问到浅拷贝和深拷贝的区别,正好群里也 ...

  7. 浅拷贝和深拷贝的区别?如何实现深拷贝?

    一.数据类型存储 JavaScript中存在两大数据类型: 基本类型 引用类型 基本类型数据保存在在栈内存中 引用类型数据保存在堆内存中,引用数据类型的变量是一个指向堆内存中实际对象的引用(也叫作IP ...

  8. 将对象拷贝一份备用,改变原对象的属性时,为啥备份数据也改变了?(赋值、浅拷贝和深拷贝的区别)

    前言 前两天在写代码时碰到一个很奇怪的问题,我有一个对象person = {name: ''tianxin, age: 18};,我需要将person目前的数据拷贝一份备用let copyPerson ...

  9. 浅拷贝与深拷贝的区别(详解)

    浅拷贝与深拷贝的区别 html 浅拷贝与深拷贝 一.数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型. 基 ...

最新文章

  1. Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧
  2. Python中re的match、search、findall、finditer区别正则
  3. oraclek导出表_Oracle导出DMP文件的两种方法
  4. CUDA学习(六十三)
  5. 数据结构之单链表(头结点)的一些常用操作(增删改查逆)
  6. 当前主要使用的python版本_动力火车当歌词
  7. vue工程化与路由router
  8. python控制mt4自动交易软件排名_股票自动交易软件排名
  9. java自定义findbugs规则,定制 findbugs规则 - 阿里巴巴一个测试架构师 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  10. 关于Windows Boot Manager、Bootmgfw.efi、Bootx64.efi、bcdboot.exe 的详解
  11. ssm产品销售管理系统计算机毕业设计
  12. NAT穿透技术、穿透原理和方法详解
  13. 高职大学计算机专业老师试讲面试,毫无经验应聘高职院校教师怎么准备试讲和面试...
  14. 《哈佛通识教育红皮书》 哈佛委员会著
  15. PTA翁恺7-6 厘米换算英尺英寸 (15 分)
  16. 渗透测试 | UserInfo信息收集
  17. 利用ajax从jsp中返回的字符串时出现回车符号解决办法
  18. 国外问卷调查该怎么做?入门须知!
  19. BI神器Power Query(12)-- PQ创建时间维度表(1)
  20. vue开发的音乐小播放器

热门文章

  1. cv python 样例_【CV实战】OpenCV—Hello world代码示例
  2. 安卓setclicklistener函数没有_金主脚本按键精灵安卓按键初体验—乱斗西游2自动签到...
  3. ar 微信小程序_微信AR玩法支持实现后,微信小程序会有想象空间吗?
  4. jsonb 查询_如何使用IN运算符查询jsonb数组
  5. arduinows2812灯条程序_Arduino 控制WS2812 LED灯条
  6. 博客访问量终于破10000了
  7. java常用技术栈,HR的话扎心了
  8. python【数据结构与算法】关于树和二叉树的探索与计算
  9. 【编译原理】关于解释器和编译器的讨论
  10. putty php环境搭建,centos7(linux)系统下php搭建环境和创建laravel项目