美文网首页
手撸最简单的深拷贝

手撸最简单的深拷贝

作者: 邹小小白 | 来源:发表于2021-02-26 15:22 被阅读0次

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)
打印结果:

相关文章

  • 手撸最简单的深拷贝

    1.在撸深拷贝之前我们来了解一下什么是浅拷贝 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型...

  • 深浅拷贝理解

    先看最简单的赋值 (a=b) 浅拷贝 补充说明浅拷贝 如图 深拷贝

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • 深入四种深拷贝方式

    最简单的深拷贝 深拷贝的问题其实可以分解成两个问题,浅拷贝+递归,什么意思呢?假设我们有如下数据 只需稍加改动上面...

  • 手写深拷贝

    手写深拷贝 深拷贝 深拷贝简单理解就是b是a的一份拷贝,且b中不存在a中对象的引用 深拷贝的实现 1.JSON序列...

  • 认识js下的浅拷贝与深拷贝

    浅拷贝与深拷贝 首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只拷贝一...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

网友评论

      本文标题:手撸最简单的深拷贝

      本文链接:https://www.haomeiwen.com/subject/huwmfltx.html