手撸最简单的深拷贝

1.在撸深拷贝之前我们来了解一下什么是浅拷贝


浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。

Object.assign、 扩展运算符...、Array.prototype.slice()、Array.prototype.concat()等等...

2.深拷贝


深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象

常用JSON.parse(JSON.stringify())但是会有点小问题,大家注意一下

1、如果obj里面有时间对象,时间将只是字符串的形式。而不是时间对象

2、如果obj里有正则RegExp、Error对象,则序列化的结果将只得到空对象

3、如果obj里有函数func(),undefined,则序列化的结果会把函数或 undefined丢失

4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null

示例:

let a={

  b:12,

  c:'asd',

  e:'null',

  i:undefined,

  func:function(){

      console.log("这是一个func")

    },

date: [new Date(1536627600000), new Date(1540047600000)],

reg: new RegExp('\\w+')


}

let copy = JSON.parse(JSON.stringify(a))

a.i = 9999

a.b = 9999

console.log(a) //{b: 9999, c: "asd", e: "null", i: 9999, func: ƒ, …}

console.log(copy)

//{b: 12, c: "asd", e: "null", date: Array(2), reg: {…}}

b: 12

c: "asd"

date: (2) ["2018-09-11T01:00:00.000Z", "2018-10-20T15:00:00.000Z"]

e: "null"

reg: {}

好了,不多说了,简单的深拷贝如下:

let obj={
  a:1,

  arr:[1,2],

  obj:{

    name:'zou xiao bai',

    arrary: ['a', 'b'],

  },

  get:function(){

    console.log("这是一个getfunc")

  }

}

let newObj= {}

function copyObj(obj, newObject){

  for(let key in obj){

    if(obj[key] instanceof Object &&!(obj[key] instanceof Array)&&!(obj[key] instanceof Function)){

      newObject[key] = {}

      copyObj(obj[key] , newObject[key])

    }else if(obj[key] instanceof Array) {

      newObject[key] = []

      copyObj(obj[key] , newObject[key])

    }else {

      newObject[key] = obj[key]

    }

  }

}

copyObj(obj, newObj)

console.log(obj)

obj.a=999

obj.obj.name='zhangsanfeng'

console.log(obj)

console.log(newObj)
打印结果:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容