比如A复制了B的值,修改A,B也跟着改变,这就叫做浅拷贝;
比如A复制了B的值,修改A,B不变,这就叫做深拷贝;
可能看了这两句话之后大家还是不太理解是什么意思,首先我们来看个例子
var a = 123;
var b = a;
b = 24;
console.log(a,b); // a=123;b=24
var obj = {
x:23
};
var obj1 = obj;
obj1.x=32;
console.log(obj,obj1) // obj = {x:32};obj1 = {x:32}
这是为什么呢?为什么把a赋值给b,b改变了,a没有变,而第二个例子中,同样的操作,把obj赋值给obj1,当修改obj1里的数据时,obj也会跟着改变的;这就要说到变量储存类型;
基本数据类型:(string, number, boolean, null ,undefined)它们的值是直接存储在栈中;
引用数据类型: (Object, Array)在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象,而对象对应的数据存储在堆中;
也就是说基本数据类型是可以直接按值访问,所以就不存在什么浅拷贝与深拷贝;而引用类型实际上相当于是把obj的引用地址复制了一份给obj1,但是实际上他们共同指向了同一个堆内存对象,所以修改obj2其实就是修改那个对象,所以通过obj1访问也能访问的到。
实现深拷贝的方法
一、递归
把父对象中所有属于对象的属性类型都遍历赋给子对象即可
function deepCopy(obj)
{
if(typeof obj != 'object' || obj == null) return obj;
var newObj = obj instanceof Array ? []:{};
for(var i in obj)
{
newObj[i] = typeof obj[i] === 'object' && obj[i] != null ? deepCopy(obj[i]) : obj[i];
}
return newObj;
}
二、利用JSON内置方法
JSON.parse与JSON.stringify搭配使用
原理:首先利用JSON.stringify将对象转变为JSON字符串,然后再用JSON.parse将JSON字符串转为对象,在转为对象的时候,会构建新的内存地址存放数据。
本文详细解释了浅拷贝与深拷贝的概念,通过实例对比基本数据类型与引用数据类型的拷贝区别,深入探讨了变量存储类型对拷贝的影响,并提供了实现深拷贝的两种方法。
5503

被折叠的 条评论
为什么被折叠?



