js的数据类型有数字、字符串、布尔、null、undefined和对象,其中数字、字符串、布尔、null、undefined属于基本数据类型,对象属于引用数据类型。
基本数据类型的存储是存储在栈里的,引用类型是存储在堆里的,然后将堆地址存贮在栈里
复杂数据类型引用
const obj1 = { a: 1 }const obj2 = obj1
这种情况我们称为obj1和obj2同时引用对象 { a: 1 } 的地址
浅拷贝
对于拷贝来说,是将对象的每一个属性都复制给另外一个对象,如果只是复制最外层的属性,不考虑多层嵌套情况,我们称之为浅拷贝,例如:
// 浅拷贝const obj = {a: 1,b: 2}const shallowCopy = value => {// copy 动作}const copyObj = shallowCopy(obj) // { a: 1, b: 2 }
最后拷贝出来的是另一个对象,obj和copyObj地址不一样,但是对于多层嵌套的对象,想要进行完全拷贝,要进行递归,这就是深拷贝的内容
深拷贝
深拷贝是在浅拷贝的基础上,将对象的复杂数据类型的属性进行递归拷贝,实现方法:
// 获取数据类型const getType = value => {const objectType = Object.prototype.toString.call(value);const type = objectType.match(/^\[object (.*)\]$/)[1];return type.toLowerCase()}// 深拷贝const deepCopy = value => {let copyValue = valueconst type = getType(value)if (type === 'object') {copyValue = {}for (const key in value) {copyValue[key] = deepCopy(value[key])}}if (type === 'array') {// copyValue = []copyValue = value.map(i => deepCopy(i))}return copyValue}const obj1 = {a: 1,b: {c: 2,d: [1, 2, 3]}}deepCopy(obj1)

