解析深拷贝和浅拷贝
对于这个的区别我们还是要先了解一下储存问题
基础数据类型(primitive data types):这个是储存在栈里面;
引用数据类型(Composite data types):这个是储存在堆里面的;
在栈中直接开辟空间储存,但是在堆里面是存储的是地址。这就解释了如果直接赋值基本数据类型的话是重新开辟空间,但是引用数据类型赋值的时候是直接赋值的地址,赋值的值还是指向原来值的地址。
这样一来就有了深拷贝和浅拷贝区别。
浅拷贝
- 直接用等号赋值
- 使用Object.assign
深拷贝
- 自己写一个递归进行逐一赋值
这样的代码几乎没有什么问题
这个可以代码演示一下
var obj = {
a: 10,
c: 20,
function(params) {
console.log(params);
},
v: undefined
}
var arr = [4, 5, [6, 7, { 5: 20 }]]
function shenkaobei(data) {
var NewData = data instanceof Array ? [] : {};
for (const i in data) {
NewData[i] = typeof data[i] == "object" ? shenkaobei(data[i]) : data[i]
}
return NewData
}
console.log(shenkaobei(arr));
console.log(shenkaobei(obj));
结果:
[ 4, 5, [ 6, 7, { ‘5’: 20 } ] ]
{ a: 10, c: 20, function: [Function: function], v: undefined }
2.利用 JSON.parse(JSON.stringify())
console.log(JSON.parse(JSON.stringify(obj)));
console.log(JSON.parse(JSON.stringify(arr)));
结果:
{ a: 10, c: 20 }
[ 4, 5, [ 6, 7, { ‘5’: 20 } ] ]
这个方法会有些问题就是 不能复制出函数和undefined
还有个小问题就是具有循环引用的对象时,会报错
这些就是我大概的整理 我是一个小白 大佬多多关照 这个我的第一篇
以后加油 未来可期 谢谢大家