JavaScript中的深拷贝问题
在阅读下面文章之前,让我们来先了解什么叫做深拷贝?
学习JavaScript的入门一定是从数据类型进行
变量存储类型分两类
①基本类型:直接存储在栈中的数据。(字符串、布尔值、未定义、数字、null)
②引用类型:将该对象引用地址存储在栈中,然后对象里面的数据存放在堆中。(数组、对象、函数)
浅拷贝和深拷贝的区别
对于浅拷贝,程序拷贝的是对象的引用,而不是对象的值
而对应的深拷贝,则是拷贝的是对象的值,也就是在拷贝的同时会出现两个不同的引用,当不同引用重新赋值时,不会改变原来数据的改变
浅拷贝
基本数据类型进行copy的时候,通常会将值一起改变
var a = 3
var b = a
a=5
console.log(a) // 5
console.log(b) // 5`
引用类型的浅拷贝
var obj1 = {
a: 1,
b: 2,
c: 3
}
var obj2 = obj1;
obj2.a = 5;
console.log(obj1.a); // 5
console.log(obj2.a); // 5
在执行完上面代码的时候,两个对象的值全部改变。对于引用类型,将obj1赋给obj2的时候,只是在堆内存中obj1的引用指向了obj2,那么两个对象就公用了同一个值,当obj2重新赋值时,修改的时堆内存中公用数据,所以obj1的值也会发生改变。
深拷贝
我们在实际的项目中,有时会需要利用相同的值做不同的数据操作,那么我们就会利用到深拷贝
深拷贝作用在通常引用类型上!例如:Object,Array
深拷贝不会拷贝引用类型的引用,而是将引用类型的值全部拷贝一份,形成一个新的引用类型,这样就不会发生引用错乱的问题,使得我们可以多次使用同样的数据,而不用担心数据之间会起冲突
JSON.stringif()和JSON.Parse()
我们知道stringif()方法,就是说把原来是对象的类型转换成字符串类型
而Parse()就是将字符串类型转化为 JSON格式,也就是对象、
如果不理解这两种方法的使用,可以参考下面的文章
点击链接https://www.cnblogs.com/SmallStrange/p/10641630.html
stringif()和parse()其实一个深拷贝的引用,但是这两个方法有使用局限性,因为在使用时是不可以拷贝 undefined , function, RegExp 等等类型的
var obj1 = { a: 1,b: 2,c: 3}
var objString = JSON.stringify(obj1);
var obj2 = JSON.parse(objString);
obj2.a = 5;
console.log(obj1.a); // 1
console.log(obj2.a); // 5
Object.assgin()
var obj1 = { a: 1,b: 2,c: 3}
var obj2 = Object.assign({}, obj1);
obj2.b = 5;
console.log(obj1.b); // 2
console.log(obj2.b); // 5
这里简单概述了深拷贝和浅拷贝的区别
下面文章对assgin的用法的具体讲述
https://blog.csdn.net/Calla_Lj/article/details/89478765