JavaScript->深浅备份的缺点版权声明

原创
小哥 3年前 (2022-11-16) 阅读数 41 #大杂烩

原始链接: 单击此处跳转

引用类型的值的浅副本。

var arr1 = [1,2,3]

var arr2 = arr1

arr2[0] = -1

console.log(arr1)  // [-1, 2, 3]

console.log(arr2)  // [-1, 2, 3]

Object.assign()

对象中的第一层是深度复制的基本类型,浅层复制的对象引用类型。

var arr1 = {a:0, b: {c: 2}};

var arr2 = Object.assign({}, arr1) 

arr2.b.c = 1

arr2.a = 1

console.log(arr1);  // {a:0, b: {c: 1}};  基本类型的深拷贝,引用类型的浅拷贝

console.log(arr2);  // {a:1, b: {c: 1}};  基本类型的深拷贝,引用类型的浅拷贝

slice() 和 concat()

基本类型的深度复制和引用类型的浅层复制仅适用于不包含引用对象的一维数组的深度复制。

var arr1 = [1,2,3];

var arr2 = arr1.slice(0);  // 或者 var arr2 = arr1.concat();

arr2[0] = -1;

console.log(arr1); // [1, 2, 3]     基本类型的深拷贝,引用类型的浅拷贝

console.log(arr2);  // [-1, 2, 3]    基本类型的深拷贝,引用类型的浅拷贝

var arr11 = [{a: 1}, {b: 2}];

var arr22 = arr11.slice(0);  // 或者 var arr2 = arr1.concat();

arr22[0].a = 2

console.log(arr11); //  [{a: 2}, {b: 2}];    基本类型的深拷贝,引用类型的浅拷贝

console.log(arr22);  //  [{a: 2}, {b: 2}];     基本类型的深拷贝,引用类型的浅拷贝

JSON.parse(JSON.stringfy)

实现深度复制的原理:堆栈打开新的内存空间,实现深度复制。

var targetObj = JSON.parse(JSON.stringify(obj))     // 是深度复制

缺陷:

如果对象中有函数,则无法复制该函数。

无法拷贝copyObj对象原型链上的属性和方法。

实际场景可能在对象中没有函数,并且原型链上没有属性和方法。大多数场景可以直接JSON.parse(JSON.stringify(obj))

递归

缺陷:

当堆栈爆炸时,数据级别非常深,递归溢出堆栈。 https://zhuanlan.zhihu.com/p/73411916

循环引用

// 循环引用

var a = {};

a.a = a;

clone(a) // Maximum call stack size exceeded 直接死循环

第三方库

lodash的cloneDeep
本质是递归复制,对于数组或对象的属性,以及递归判断,如果属性。(数组便是index)的value是一个number,string执行完毕,移交执行权。如果是数组或对象,递归将继续。

https://blog.csdn.net/weixin\_34049948/article/details/88772727

immutable.js的深拷贝
其内部用途 Trie(字典树) 数据结构, Immutable.js 将放置所有对象 key 进行 hash 映射,结果 hash 该值从向后到向前转换为二进制。 5 位被分割,然后被转换 Trie 树处理大量数据比直接深度复制要高效得多。

https://blog.csdn.net/weixin\_33965305/article/details/87958945

proxy和immer的深拷贝
通过拦截 set 和 get 当然,我们可以实现我们想要的 Object.defineProperty() 也可以。事实上immer这个库使用这种方法来生成不可变对象。原则是建立new Map(),确定传入参数是否已修改。如果它没有被修改,它将直接返回原始数据并停止此分支的遍历。如果已修改,将从中检索copy在值中,然后将copy中的属性执行一次。 finalize 函数。

http://www.javanx.cn/20191217/js-deep-copy/

参考链接: https://www.jianshu.com/p/bfe901f178f6

作者:SophieRabbit
链接:https://www.jianshu.com/p/2795ec5e640f
资料来源:简报
版权归作者所有。商业转载请与作者联系以获得授权,并注明非商业转载的来源。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门