JavaScript对象的深拷贝和浅拷贝 - 2024最新版前端秋招面试短期突击面试题【100道】

JavaScript对象的深拷贝和浅拷贝 - 2024最新版前端秋招面试短期突击面试题【100道】 📋

在JavaScript中,对象的深拷贝和浅拷贝是处理对象复制时的重要概念。了解这两种拷贝方式的区别及实现方法,可以帮助你更好地管理和操作对象数据。

浅拷贝(Shallow Copy) 🌊

浅拷贝只会复制对象的第一层属性。如果属性值是基本类型,则拷贝的是基本类型的值;如果属性值是引用类型,则拷贝的是内存地址。这意味着原始对象和浅拷贝对象会共享引用类型的属性。

实现浅拷贝的几种方法

  1. 使用 Object.assign 方法

    javascript 复制代码
    const original = { a: 1, b: { c: 2 } };
    const shallowCopy = Object.assign({}, original);
  2. 使用扩展运算符(Spread Operator)

    javascript 复制代码
    const original = { a: 1, b: { c: 2 } };
    const shallowCopy = { ...original };

示例

javascript 复制代码
const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };

shallowCopy.b.c = 3; // 修改浅拷贝对象的属性
console.log(original.b.c); // 输出 3,原始对象的属性也被改变

深拷贝(Deep Copy) 🕵️‍♂️

深拷贝会复制对象的所有层级属性。如果属性值是基本类型,则拷贝的是基本类型的值;如果属性值是引用类型,则会创建一个新的对象或数组,并递归复制其所有属性。

实现深拷贝的几种方法

  1. 使用 JSON.parseJSON.stringify

    javascript 复制代码
    const original = { a: 1, b: { c: 2 } };
    const deepCopy = JSON.parse(JSON.stringify(original));

    注意:这种方法不能复制函数、undefined、循环引用等。

  2. 手动实现递归深拷贝

    javascript 复制代码
    function deepClone(obj) {
        if (typeof obj !== 'object' || obj === null) {
            return obj; // 如果不是复杂数据类型,直接返回
        }
        let clone;
        if (Array.isArray(obj)) {
            clone = [];
            for (let i = 0; i < obj.length; i++) {
                clone[i] = deepClone(obj[i]);
            }
        } else {
            clone = {};
            for (let key in obj) {
                if (obj.hasOwnProperty(key)) {
                    clone[key] = deepClone(obj[key]);
                }
            }
        }
        return clone;
    }
    
    const original = { a: 1, b: { c: 2 } };
    const deepCopy = deepClone(original);
  3. 使用第三方库,如 lodash 的 _.cloneDeep 方法

    javascript 复制代码
    const original = { a: 1, b: { c: 2 } };
    const deepCopy = _.cloneDeep(original);

示例

javascript 复制代码
const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));

deepCopy.b.c = 3; // 修改深拷贝对象的属性
console.log(original.b.c); // 输出 2,原始对象的属性没有被改变

选择深拷贝还是浅拷贝 🤔

选择使用深拷贝还是浅拷贝取决于你的具体需求:

  • 深拷贝:如果你需要完全独立的副本,避免原始数据被意外修改,应该使用深拷贝。
  • 浅拷贝:如果你知道不会修改原始对象中的引用类型属性,或者需要共享属性引用,那么浅拷贝可能就足够了。

通过掌握深拷贝和浅拷贝的实现方法及其适用场景,你将能够更灵活地处理JavaScript中的对象,提升你的开发效率和能力,祝你在面试中取得好成绩!

相关推荐
To_OC8 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
葫芦和十三9 小时前
图解 MongoDB 14|Cache 与淘汰:WiredTiger 的内存治理
后端·mongodb·面试
IT_陈寒13 小时前
Vue这个坑我跳了两次,原来问题出在这
前端·人工智能·后端
kyriewen13 小时前
我用 50 行代码重写了 React Router 核心,终于搞懂了前端路由原理
前端·javascript·react.js
WebInfra14 小时前
Rspack 2.1 发布:React Compiler 提速 10 倍!
前端
李明卫杭州14 小时前
CSS 媒体查询详解:一文掌握响应式设计的核心技术
前端
lichenyang45314 小时前
从 H5 按钮到 OpenHarmony 能力调用:我如何理解 ASCF 的运行链路
前端
下家15 小时前
我放弃了 Vue/React,选择自研框架
前端·前端框架
Asize15 小时前
HTML5 Canvas 基础:从按帧动画到 ECharts 数据可视化
前端·javascript·canvas
默_笙15 小时前
🎄 后端给我一堆扁平数据,我 10 行代码把它变成了树
前端·javascript