js深浅拷贝

作者 : 开心源码 本文共1623个字,预计阅读时间需要5分钟 发布时间: 2022-05-13 共207人阅读

对象类型在赋值的过程中其实是复制了地址,这样会导致一方改变的时候其余地方也都会被改变的情况

例:

let a = {    age: 1}let b = a;a.age = 2;console.log(b.age); //  2

这种情况下我们即可以使用浅拷贝来处理这个问题

浅拷贝

浅拷贝只是拷贝基本类型的数据,假如父对象的属性等于数组或者另一个对象,那么实际上,子对象取得的只是一个内存地址,因而存在父对象被篡改的可能,浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存

1、Object.assign

这个属性并不是用来实现深拷贝的,相反可以用来实现浅拷贝。Object.assign只会拷贝所有的属性到新的对象中,假如属性值是对象的活,拷贝的就是地址,所以不是深拷贝

例:

let a = {    age: 1};let b = Object.assign({}, a);a.age = 2;console.log(b.age); //  1

2、开展运算符 …

let a = {    age: 1};let b = {...a};a.age = 2;console.log(b.age); //  1

但是浅拷贝只能处理第一层的问题,假如对象下边的值还有对象的话,那么还是会有问题,假如想继续处理就要使用深拷贝了。

问题实例:

let a = {  age: 1,  jobs: {    first: 'FE'  }}let b = { ...a }a.jobs.first = 'native'console.log(b.jobs.first) // native

深拷贝

深拷贝就是能够实现真正意义上的数组和对象的拷贝。递归调用”浅拷贝”。(深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象)

通常可以通过

JSON.parse(JSON.stringify(object));

处理

let a = {  age: 1,  jobs: {    first: 'FE'  }}let b = JSON.parse(JSON.stringify(a))a.jobs.first = 'native'console.log(b.jobs.first) // FE

但是这种方法也有局限性

  • 会忽略undefined
  • 会忽略symbol
  • 不能序列化函数
  • 不能处理循环引用的对象

例如

let obj = {  a: 1,  b: {    c: 2,    d: 3,  },}obj.c = obj.bobj.e = obj.aobj.b.c = obj.cobj.b.d = obj.bobj.b.e = obj.b.clet newObj = JSON.parse(JSON.stringify(obj))console.log(newObj)

js实现深拷贝具体方法

// 深拷贝function deepClone(obj, hash = new WeakMap()) {    if (obj == null) {        return obj;    }    if (obj instanceof Date) {        return new Date(obj);    }    if (obj instanceof RegExp) {        return new RegExp(obj);    }    if (typeof obj !== 'object') {        return obj;    }    if (hash.has(obj)) {        return hash.get(obj);    }    let cloneObj = new obj.constructor;    hash.set(obj, cloneObj);    for (let key in obj) {        if (obj.hasOwnProperty(key)) {            cloneObj[key] = deepClone(obj[key], hash);        }    }    return cloneObj;}

本篇文章只是自己对深浅拷贝的一个简单了解,也参考了少量其余文章

参考文献:
https://juejin.im/book/5bdc715fe51d454e755f75ef/section/5bed40d951882545f73004f6

https://www.cnblogs.com/136asdxxl/p/8645750.html

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » js深浅拷贝

发表回复