目录
本文参考:【JS】深拷贝与浅拷贝的区别,实现深拷贝的几种方法、菜鸟教程之JavaScript 数据类型
一、JavaScript 有两种 数据类型:
1、值类型(基本数据类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
2、引用数据类型:对象(Object)、数组(Array)、函数(Function)。
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
二、JavaScript 有两种 数据拷贝方式:
1、浅拷贝:拷贝时将栈内存中存储的变量名和变量值完整的复制一遍。
(1)基本数据类型:变量名和变量值存储在栈内存中
let a=1; (变量名和变量值对应存储在栈内存中)
let b=a; (栈内存会新开辟一个内存,将栈内存中a的值拷贝给了b)
修改a的值,b的值不会变化,修改b的值也不会影响到a的值:
let a = 1;
let b = a;
console.log(a,b); //1,1
b = 2;
console.log(a,b); //1,2
(2)引用数据类型:变量名存储在栈内存中,变量值存储在堆内存中,栈内存会提供一个引用地址指向堆内存中存储的值。
let a=[0,1,2,3,4];(栈内存中存储变量名和变量值在堆内存中的引用地址)
let b=a;(栈内存会新开辟一个内存,将栈内存中a的值的引用地址拷贝给了b)
修改b的值,a会变化,修改a的值,b也会改变:
var a = [0,1,2,3,4];
var b = a;
console.log(a,b); //[0, 1, 2, 3, 4],[0, 1, 2, 3, 4]
b[0]=1;
console.log(a,b); //[1, 1, 2, 3, 4],[1, 1, 2, 3, 4]
但这不是我们想要的效果,我们希望将a赋值给b之后,修改b的值,不会影响到a的值,这就需要进行深拷贝了,显然,基本数据类型无需进行深拷贝,那么深拷贝就是针对引用数据类型而言了。
2、深拷贝:针对引用数据类型,拷贝时会将栈内存和堆内存中的数据都进行拷贝。
三、深拷贝的实现方法
function deepClone(a) {
let b = JSON.stringify(a);//将对象转为对象字符串
let objClone = JSON.parse(b);//将对象字符串解析为对象
return objClone;
}