MST

星途 面试题库

面试题:JavaScript 数组与对象操作之深度克隆与性能优化

编写一个深度克隆函数,该函数可以克隆包含数组和对象的复杂数据结构,例如 `let complexData = {a: [1, {b: 2}], c: {d: [3, 4]}};`。要求考虑性能优化,避免循环引用导致的无限递归,并阐述你在优化过程中所使用的技术和原理。
13.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
function deepClone(obj, map = new WeakMap()) {
    if (typeof obj!== 'object' || obj === null) {
        return obj;
    }
    if (map.has(obj)) {
        return map.get(obj);
    }
    let clone;
    if (Array.isArray(obj)) {
        clone = [];
    } else {
        clone = {};
    }
    map.set(obj, clone);
    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            clone[key] = deepClone(obj[key], map);
        }
    }
    return clone;
}

性能优化及原理

  1. WeakMap 避免循环引用:使用 WeakMap 来存储已经克隆过的对象。在克隆过程中,如果遇到已经处理过的对象(通过 WeakMap 检测),直接返回其克隆结果,避免无限递归。WeakMap 的键是弱引用,不会阻止对象被垃圾回收,相比 Map 更适合用于这种场景,因为不需要手动管理键值对的移除。
  2. 减少不必要的判断:在函数开始处,先判断 obj 是否为对象或 null,如果不是,直接返回。这样减少了不必要的后续处理,提高性能。同时在创建克隆对象时,根据 obj 是数组还是对象直接创建相应类型,避免多余的类型转换操作。