1. 浅拷贝1
  1. //浅拷贝1
  2. let obj01 = {
  3. name: 'Lily',
  4. age: '20',
  5. time: ['13', '15'],
  6. person: {
  7. name: 'Henry',
  8. age: '21'
  9. }
  10. };
  11. let obj02 = obj01;
  12. obj02.age = '25'; //会改变obj11的age
  13. obj02.person.age = '25'; //会改变obj11的person.age
  14. obj02.time[1] = '25'; //会改变obj11的time值
  15. console.log(obj01);

浅拷贝2-只复制一层对象的属性,如果对象中的属性值是对象,浅拷贝并不会复制对象属性中的属性

  1. //浅拷贝2-只复制一层对象的属性,如果对象中的属性值是对象,浅拷贝并不会复制对象属性中的属性
  2. let obj11 = {
  3. name: 'Lily',
  4. age: '20',
  5. time: ['13', '15'],
  6. person: {
  7. name: 'Henry',
  8. age: '21'
  9. }
  10. };
  11. let obj12 = {
  12. age: '22'
  13. };
  14. let obj13 = Object.assign({}, obj11, obj12);
  15. obj13.age = '25'; //不会改变obj11的age
  16. obj13.person.age = '25'; //会改变obj11的person.age
  17. obj13.time[1] = '25'; //会改变obj11的time值
  1. 浅拷贝3-三点(...)
  1. //浅拷贝1
  2. let obj01 = {
  3. name: 'Lily',
  4. age: '20',
  5. time: ['13', '15'],
  6. person: {
  7. name: 'Henry',
  8. age: '21'
  9. }
  10. };
  11. let obj02 = {...obj01};
  12. obj02.age = '25'; //会改变obj11的age
  13. obj02.person.age = '25'; //会改变obj11的person.age
  14. obj02.time[1] = '25'; //会改变obj11的time值
  15. console.log(obj01);
  1.  
  1. 深拷贝方法1-JSON.parse(JSON.stringify(obj))
  1. //深拷贝方法1-JSON.parse(JSON.stringify(obj))
  2. let obj21 = {
  3. name: 'Lily',
  4. age: '20',
  5. person: {
  6. name: 'Henry',
  7. age: '21'
  8. }
  9. };
  10. let obj22 = JSON.parse(JSON.stringify(obj21));
  11. obj22.person.age = '25'; //不会改变obj31的person.age
  12. console.log(obj21);
  1. 深拷贝方法2-迭代递归法for...in
  1. //深拷贝方法2-迭代递归法for...in
  2. let obj31 = {
  3. name: 'Lily',
  4. age: '20',
  5. time: ['13', '15'],
  6. person: {
  7. name: 'Henry',
  8. age: '21'
  9. }
  10. };
  11. function deepObject(obj){ //深拷贝
  12. let cloneObj = {};
  13. for(let key in obj){
  14. let objChild = Object.prototype.toString.call(obj[key]);
  15. cloneObj[key] = (objChild === '[object Array]' || objChild === '[object Object]') ? deepObject(obj[key]) : obj[key];
  16. }
  17. return cloneObj;
  18. }
  19. let obj32 = deepObject(obj31);
  20. obj32.time[0] = '25'; //不会改变obj31的time值
  21. obj32.person.age = '25'; //不会改变obj31的person.age
  22. console.log(obj31);

js对象深拷贝、浅拷贝的更多相关文章

  1. 一篇文章彻底说清JS的深拷贝/浅拷贝

    一篇文章彻底说清JS的深拷贝and浅拷贝 这篇文章的受众 第一类,业务需要,急需知道如何深拷贝JS对象的开发者. 第二类,希望扎实JS基础,将来好去面试官前秀操作的好学者. 写给第一类读者 你只需要一 ...

  2. js对象的浅拷贝与深拷贝

    浅拷贝和深拷贝都是对于JS中的引用类型而言的,浅拷贝就只是复制对象的引用(堆和栈的关系,原始(基本)类型Undefined,Null,Boolean,Number和String是存入堆,直接引用,ob ...

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

    浅拷贝 把a赋值给b,a与b指向相同的内存,修改b值,a也会跟着改变. var a = "aa"; var b = a; b = "bb"; 这个时候a也变成了 ...

  4. Map拷贝 关于对象深拷贝 浅拷贝的问题

    问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后      先看例子:     ...

  5. Java对象深拷贝浅拷贝总结

    目录 深拷贝 1. 手动new 2. clone方法 3. java自带序列化 4. json序列化 性能测试 深拷贝总结 浅拷贝 1. spring BeanUtils(Apache BeanUti ...

  6. js对象深拷贝

    数组一维深拷贝:slice.concat.Array.from 对象一维深拷贝:Object.assign 一.利用扩展运算符...对数组中嵌套对象进行深拷贝 var arr=[{a:1,b:2},{ ...

  7. 原生js 对象深拷贝

    经常需要copy一个对象,又怕拷贝有问题,那下面这段就很方便啦,不用担心copy只是一个引用了. /** @ values 需要copy的变量 */ function deepClone(values ...

  8. js 对象深拷贝

    /* *p需要拷贝的对象 * */ var deepCopy=function(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] ...

  9. js对象浅拷贝和深拷贝详解

    js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...

随机推荐

  1. windows下使用zookeeper

    windows下dos窗口操作:https://blog.csdn.net/a632189007/article/details/78085858

  2. windows下php配置环境变量

    这样重启终端后,通过php -v可查看新使用的php版本信息. 注:在path配置在上方的先生效

  3. 13 Python之第一类对象闭包和迭代器

      def fn():     print("我叫fn") fn() print(fn)## <function fn at 0x0000000001D12E18> f ...

  4. init container

    init container与应用容器在本质上是一样的, 但它们是仅运行一次就结束的任务, 并且必须在成功执行完成后, 系统才能继续执行下一个容器, 可以用在例如应用容器启动前做一些初始化工作,当in ...

  5. jquery前端问题随记

    1.图片名称不变,但要求刷新,web页面不重新加载渲染,在url地址后面加t=时间戳 js脚本 img.src=url+"?t="+Math.random() 如果是jsp页面,要 ...

  6. 10个不为人知的 Python 冷知识

    转载: 1. 省略号也是对象 ...这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写…来得到这玩意. 而 ...

  7. anaconda安装失败

    2019.10版本怎么安装都不行换了2018.10安装ok

  8. [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates]

    [易学易懂系列|rustlang语言|零基础|快速入门|(17)|装箱crates] 实用知识 装箱crates 我们今天来讲讲装箱技术crates. 什么是crates? 英语翻译是: 英 [kre ...

  9. 第二章 Vue快速入门-- 17 v-for指令的四种使用方式

    1.v-for循环普通数组 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  10. python+openCV实现双目视差图及测距

    通过matlab标定得到相机参数放到stereoconfig.py import numpy as np import cv2 #双目相机参数 class stereoCameral(object): ...