首页 > 其他 > 详细

深拷贝和浅拷贝的区别是什么?实现一个深拷贝

时间:2019-08-17 12:05:46      阅读:100      评论:0      收藏:0      [点我收藏+]

JS的基本数据类型

  • 基本数据类型:String,Boolean,Number,Undefined,Null;
  • 引用数据类型:Object(Array,Date,RegExp,Function);

浅拷贝

  • 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。
  • Object.assign、 扩展运算符 ... 、 Array.prototype.slice()、 Array.prototype.concat() 等

深拷贝

  • 深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。
  • 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象

示例:

    let obj = {
        name : ‘Michael‘,
        age  :  18 ,
        others : {
            hobbies : [‘basketball‘,‘gambling‘],
            team : ‘Bulls‘,
        },
    }
    let [newObj,newObj2] = [Object.assign({},obj),{...obj}]
    
    obj.name = ‘Kobe‘;
    obj.others.team = ‘Lakers‘;

    console.log(obj)
console.log(newObj)
console.log(newObj2)

技术分享图片

我们能看出:

  • newObj及newObj2的others为引用数据类型,因此与原对象obj的属性值指向同一块内存地址,修改原对象的others内的内容,新对象的内容也会更改
  •  第一层的属性值为基本数据类型(String),修改原对象,对新对象不造成影响

 

因此 深拷贝与浅拷贝的区别为

 

  • 浅拷贝当第一层的属性值是基本数据类型时,新的对象和原对象互不影响,但是如果第一层的属性值是引用数据类型时,那么新对象和原对象的属性值其指向的是同一块内存地址。
  • 深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象;

深拷贝的代码实现

  1. 如果是基本数据类型,直接返回
  2. 如果是复杂数据类型,递归。
  3. 如果是RegExp 或者 Date 类型,返回对应类型

出门有事,回来继续写。。。。。

 

深拷贝和浅拷贝的区别是什么?实现一个深拷贝

原文:https://www.cnblogs.com/dajuyiding/p/11367883.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!