js 深拷贝

1.function deepClone(obj) {
    let result;
    if (typeof obj == 'object') {
        result = isArray(obj) ? [] : {}
        for (let i in obj) {
            result[i] = isObject(obj[i]) ? deepClone(obj[i]) : obj[i]
        }
    } else {
        result = obj
    }
    return result
}
function isObject(obj) {
    return Object.prototype.toString.call(obj) == "[object Object]"
}
function isArray(obj) {
    return Object.prototype.toString.call(obj) == "[object Array]"
}

 

2.var b = JSON.parse(JSON.stringify(a));    

<think> 首先,用户的问题是“JS深拷贝”,这是关于JavaScript中的深拷贝概念。我需要用中文回答这个问题。 我的回答应该包括: 1. 解释什么是深拷贝(deep copy)。 2. 介绍在JavaScript中如何实现深拷贝。 3. 提供一些代码示例或方法。 关键点是:在回答结束后,必须提出3-5个相关问题。这些相关问题必须以“§§相关问题§§”开头,并且是第一行输出相关内容。禁止换行分散,意思可能是“§§相关问题§§”后面直接列出问题列表,不能有额外的换行。 从示例格式中: - 回答部分可以是文本和代码。 - 然后直接输出“§§相关问题§§”。 - 接着是1. ··· 2. ··· 3. ··· 格式的问题列表。 所以,我需要确保: - 回答完整。 - 结束时输出“§§相关问题§§”。 - 列出3-5个相关问题。 现在,构建回答内容: - **解释深拷贝**:在JavaScript中,深拷贝指的是创建一个新对象,其中所有嵌套对象也被复制,而不是共享引用。浅拷贝则只复制顶层属性。 - **如何实现**: - 使用内置方法:如`JSON.parse(JSON.stringify(object))`,但有限制(无法复制函数、undefined、循环引用等)。 - 使用递归函数:手动遍历对象的所有属性,创建新对象。 - 使用库:如Lodash的`_.cloneDeep()`。 - **提供代码示例**:展示一个简单的深拷贝函数实现。 然后,提出相关问题。相关问题应该基于用户的问题和我的回答。例如: 1. 深拷贝和浅拷贝有什么区别? 2. 在JavaScript中,`JSON.parse(JSON.stringify())`方法有哪些局限性? 3. 如何处理循环引用在深拷贝中? 4. 使用第三方库如Lodash进行深拷贝有什么优缺点? 5. 在哪些场景下推荐使用深拷贝? 确保有3-5个问题。 最后,输出格式: - 结束回答后,直接输出“§§相关问题§§”,然后列出问题,每个问题用数字点号开始。 完整结构: - 回答部分。 - §§相关问题§§ - 1. ... - 2. ... - 3. ... </think> 在 JavaScript 中,深拷贝(deep copy)是指创建一个新对象,该对象的嵌套属性值也被完全复制,而不是共享引用(即被复制对象与原对象在内存中完全独立)。这与浅拷贝(shallow copy)不同,浅拷贝只复制顶层属性,嵌套对象仍然是引用。深拷贝在处理复杂数据结构(如对象中包含数组或其他对象)时特别重要,以避免意外修改原对象。 ### 实现深拷贝的方法: 1. **使用 `JSON.parse(JSON.stringify())` 方法**: - 这是最简单的方式,但有限制:无法复制函数、`undefined`、`Symbol` 值或循环引用(对象属性指向自身)。 - 示例代码: ```javascript function deepCopySimple(obj) { return JSON.parse(JSON.stringify(obj)); } const original = { a: 1, b: { c: 2 } }; const copy = deepCopySimple(original); copy.b.c = 3; // 修改副本不会影响原对象 console.log(original.b.c); // 输出 2 ``` 2. **手动实现递归深拷贝函数**: - 通过递归遍历对象所有属性,处理不同类型(如数组、对象、日期等),并可自定义处理函数或循环引用。 - 示例代码: ```javascript function deepCopy(obj) { if (obj === null || typeof obj !== 'object') { return obj; // 返回基本类型值 } if (obj instanceof Date) { return new Date(obj); // 处理日期对象 } if (Array.isArray(obj)) { return obj.map(item => deepCopy(item)); // 处理数组 } const copy = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { copy[key] = deepCopy(obj[key]); // 递归复制属性 } } return copy; } const originalObj = { name: "test", data: [1, 2, { key: "value" }] }; const copiedObj = deepCopy(originalObj); copiedObj.data[2].key = "newValue"; // 修改副本不影响原对象 ``` 3. **使用第三方库(如 Lodash)**: - 推荐使用 `_.cloneDeep()` 方法,它处理了边缘情况(如循环引用),并支持各种数据类型。 - 示例代码: ```javascript const _ = require('lodash'); const original = { a: 1, b: [2, 3] }; const copy = _.cloneDeep(original); ``` ### 注意事项: - **循环引用问题**:手动实现时,需使用 `WeakMap` 跟踪已复制对象,避免无限递归。 - **性能考虑**:深拷贝可能消耗较多内存和时间,特别对于大型对象,建议仅在必要时使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值