学习深浅拷贝

132 阅读2分钟

首先了解什么是深浅拷贝

浅拷贝:
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象
深拷贝:
深拷贝就是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象

借用colid大佬的图片

image.png

image.png\

赋值与深浅拷贝的区别

在这里应用浪里行舟大佬的图片\

image.png

浅拷贝的表现形式

1.Object.assign(target,source)

2.es6扩展运算符

eg:

const obj={ a:1, name:'sariy' }

const newObj=...obj

3.Array.prototype.concat()

4.Array.prototype.slice()

深拷贝表现形式

1.JSON.stringfy能实现80%的深拷贝

处理一下集几种情况不能使用这种方式

1.如果obj里面存在时间对象,拷贝完会变为字符串

2.如果obj里有RegExp、Error对象,拷贝完变成空对象

3.如果obj里有函数,undefined,拷贝完属性会丢失

4.如果obj里有NaN、Infinity和-Infinity,拷贝会变成null

5.如果obj中的对象是有构造函数生成的,拷贝后,会丢弃对象的constructor

6.如果对象中存在循环引用的情况也无法正确实现深拷贝

2.深拷贝实现

` function deepClone(obj){

if(!obj || typeof obj ==='object') return

let result= Array.isArray(obj)?[]:{}

for(let i in obj){

if(obj.hasOwnproperty(i)){

  result[i]=obj[i]==="object"?deepClone(obj[i]):obj[i]
  
}

}

return result

} `

3.下载lodash工具库 使用_lodash.cloneDeep()方法实现深拷贝

有不足之处望各位指出,做前端工匠,一起见证成长!