前端面试题整理——深拷贝
const obj = {
a: 100,
b: {
b1: [1, 2, 3],
b2: 'string'
},
c: ['a', 'b', 'c']
}
/*
* 没做深拷贝的效果
const obj2 = obj
obj2.a = 200
obj2.b.b2 = 'abc123'
obj2.c[0] = 'aa'
console.log(obj)
console.log(obj2)
obj2修改的内容会影响obj的内容,因为他们修改的都是同一个堆内容
* */
const obj2 = deepClone(obj);
obj2.a = 200
obj2.b.b2 = 'abc123'
obj2.c[0] = 'aa'
console.log(obj)
console.log(obj2)
/**
* 深拷贝
* @param {Object} obj 要深拷贝的对象
* */
function deepClone(obj = {}) {
// obj如果不是引用类型,或者是null,直接返回
if (typeof obj !== 'object' || obj == null) {
return obj
}
// 初始化返回结果
let result;
if (obj instanceof Array) {
result = []
} else {
result = {}
}
// 遍历obj
for (let key in obj) {
// 保证key不是原型的属性
if (obj.hasOwnProperty(key)) {
// 递归调用
result[key] = deepClone(obj[key])
}
}
return result
}
考点:
不同类型使用内存堆栈的情况
赞 (0)
