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 }
考点:
不同类型使用内存堆栈的情况