JavaScript 的类型分为简单类型和复合类型。简单类型是存储在栈中的,变量之间传递的是值;复合类型是存储在堆中的,传递的是引用,即变量在内存中的地址。
let obj1 = {
foo: 10,
bar: 10
}
let obj2 = obj1;
obj2.foo = 20;
console.log(obj1)
/*
* obj1 输出的是 { foo: 20, bar: 10 }
* */
如上面的代码所示,当修改obj2的时候obj1的值也变了,所以需要实现对象类型传递的时候,需要实现深度拷贝,即obj2和obj1完全独立,修改值得时候不会相互影响。
实现代码如下所示:
function copy(value) {
//可复制的类型 undefined null symbol number string Boolean object Array Set Map
let copyValue = null;
// 简单类型的数据直接返回
if (value === null || typeof(value) !== 'object')
return value;
// 复合类型的数据需要遍历赋值
else {
if (Array.isArray(value)) {
copyValue = []
for (let i = 0;i < value.length; i++) {
if((value[i] !== null && typeof(value [i]) === 'object'))
copyValue[i] = copy(value[i])
else
copyValue[i] = value[i]
}
} else if(value instanceof Set) {
copyValue = new Set()
for (let val of value.values()) {
if(val !== null && typeof(val) === 'object')
copyValue.add(copy(val))
else
copyValue.add(val)
}
} else if (value instanceof Map) {
copyValue = new Map()
for (let [key,val] of value.entries()) {
if(val !== null && typeof(val) === 'object')
copyValue.set(key,copy(val))
else
copyValue.set(key,val)
}
} else {
copyValue = {}
for (let key in value) {
if(value[key] !== null && typeof(value[key]) === 'object')
copyValue[key] = copy(value[key])
else
copyValue[key] = value[key]
}
}
}
return copyValue
}
如有不足欢迎指正~~~