深拷贝和浅拷贝的区别(javascript篇)
javascript中的深拷贝和浅拷贝概念理解
·
一、深拷贝和浅拷贝的概念
首先,我们需要明确的一点是,深拷贝和浅拷贝的概念只适用于对象或者数组这种复杂数据类型(引用数据类型)。
浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组)
深拷贝:在内存中开辟一个新的存储空间,完完全全的拷贝一整个一模一样的对象(数组)
不论是number,string,boolean还是object,array都会被存储在内存中。
而内存又被分为栈内存和堆内存。
基本数据类型比如:string,number,boolean,null,undefined等等会被直接存储到栈内存中。
而像数组,对象等由多种基本数据类型组成的复杂数据类型,他们的实体内容则会被存储到堆内存中。栈内存只会存储他们在堆内存的一串地址。
二、浅拷贝
浅拷贝的意思就是,复制了对象(数组)存储在栈内存中的地址,而不是在内存中重新开辟一个新的存储空间用于存储新的对象。也就是两个对象共用一个内容。
代码如下(示例):浅拷贝示例
let obj_1 = {
a:1,
b:2
}
console.log(obj_1); //输出{a:1,b:2}
let obj_2 = obj_1; //典型的浅拷贝
console.log(obj_2); //输出{a:1,b:2}
obj_1.a = 10;
console.log(obj_2); //输出为{a:10,b2}
由上方实例可知,当obj_1的内容改变时,obj_2的内容也会改变。
原因很简单:obj_2拷贝了obj_1在栈内存中的地址。所以obj_2和obj_1现在共用存储在堆内存的数据。所以,当obj_2改变的时候,obj_1也就随之改变了。
三、深拷贝
深拷贝不同于浅拷贝的是。不比浅拷贝只会拷贝栈内存中的数据地址。深拷贝会在内存中重新开辟一段新的存储空间。使得两个对象(数组)指向两个不同的堆内存数据。从而实现改变互不影响。
代码如下(示例):深拷贝示例
let obj_1 = {
a:1,
b:2
}
console.log(obj_1); //输出{a:1,b:2}
//使用JSON的stringify和parse是深拷贝的一种方式
//(但是这个方法有坑,不建议使用,这里只是做个示例)
let obj_2 = JSON.stringify(obj_1);
let obj_3 = JSON.parse(obj_2);
console.log(obj_3); //输出{a:1,b:2}
obj_1.a = 10;
console.log(obj_3); //输出依然为{a:1,b:2}
由上例可知obj_3是obj_1的深拷贝对象,所以obj_3不会随着obj_1的改变而改变
总结
- 深拷贝和浅拷贝的概念只针对复杂数据类型。
- 深拷贝可以通过JSON的stringify方法和parse方法进行(但是有坑,不推荐使用)
- 浅拷贝是只拷贝复杂数据类型的在栈内存中的地址。本质上两个对象(数组)指向的还是同一块堆内存数据空间
- 深拷贝会在堆内存中重新生成一块新的存储空间实现完完全全的对象(数组)复制
表达不当,请多指教。
希望这篇分享能为你提供帮助。
更多推荐
已为社区贡献2条内容
所有评论(0)