浅拷贝
// 浅拷贝
function shallow(obj) {const newObj = {}for (const key in obj) {// 保证 key 不是原型的属性if (obj.hasOwnProperty(key)) {newObj[key] = obj[key]}}return newObj
}
深拷贝
递归 O(n^2)
// 深拷贝
function deepClone(obj = {}) {// 如果传入的是 null,直接返回 nullif (obj === null) return null// 如果不是对象类型(如 number、string 等基本类型),直接返回原值(无需拷贝)if (typeof obj !== "object") return obj// 初始化返回结果let result = Array.isArray(obj) ? [] : {}for (let key in obj) {// 保证 key 不是原型的属性if (obj.hasOwnProperty(key)) {// 递归调用!!!result[key] = deepClone(obj[key])}}return result
}
递归+Map,防止循环引用
// 深拷贝
function deepClone(obj = {}, map = new Map()) {// 如果传入的是 null,直接返回 nullif (obj === null) return null// 如果不是对象类型(如 number、string 等基本类型),直接返回原值(无需拷贝)if (typeof obj !== "object") return obj// 防止循环引用:如果当前对象已经在 map 中存在,则返回之前拷贝的结果if (map.has(obj)) return map.get(obj)// 初始化返回结果let result = Array.isArray(obj) ? [] : {}// 将当前原始对象与拷贝对象建立映射关系,防止后续递归中重复拷贝造成死循环map.set(obj, result)for (let key in obj) {// 保证 key 不是原型的属性if (obj.hasOwnProperty(key)) {// 递归调用!!!result[key] = deepClone(obj[key])}}return result
}
手写深拷贝【JS面试题】视频
js【详解】深拷贝 (含 JSON.parse(JSON.stringify(obj)) 的缺陷,5种手写深拷贝)