跳至主要內容

深拷贝

haneball大约 1 分钟JavaScriptTypeScript常用函数

概述

  • 使用递归的方式进行深拷贝,支持多种类型
  • 拷贝 Function 需要截取 {...} 内的函数体

实现

/**
 * 深拷贝
 * @param obj 对象
 * @returns 对象的副本
 */
function deepClone<T>(obj: T): T {
    // 空
    if (!obj) return obj

    // Function 类型
    if (obj instanceof Function) {
        const str = obj.toString()
        const subStr = str.substring(str.indexOf('{') + 1, str.indexOf('}'))

        return new Function(subStr) as unknown as T
    }

    // Date 类型
    if (obj instanceof Date) {
        return new Date(obj) as unknown as T
    }

    // Set 类型
    if (obj instanceof Set) {
        return new Set([...obj]) as unknown as T
    }

    // Map 类型
    if (obj instanceof Map) {
        return new Map([...obj]) as unknown as T
    }

    // Symbol 类型
    if (typeof obj === 'symbol') {
        return Symbol(obj.description) as unknown as T
    }

    // Array 类型
    if (Array.isArray(obj)) {
        return obj.map((item) => deepClone(item)) as unknown as T
    }

    // 普通对象
    if (typeof obj === 'object') {
        return Object.fromEntries(
            Object.entries(obj).map(([key, value]: [string, any]) => [key, deepClone(value)])
        ) as unknown as T
    }
    
    // 基本类型
    return obj
}