深拷贝
大约 1 分钟
概述
- 使用递归的方式进行深拷贝,支持多种类型
- 拷贝 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
}
/**
* 深拷贝
* @param obj 对象
* @returns 对象的副本
*/
function deepClone(obj) {
// 空
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)
}
// Date 类型
if (obj instanceof Date) {
return new Date(obj)
}
// Set 类型
if (obj instanceof Set) {
return new Set([...obj])
}
// Map 类型
if (obj instanceof Map) {
return new Map([...obj])
}
// Symbol 类型
if (typeof obj === 'symbol') {
return Symbol(obj.description)
}
// Array 类型
if (Array.isArray(obj)) {
return obj.map((item) => deepClone(item))
}
// 普通对象
if (typeof obj === 'object') {
return Object.fromEntries(
Object.entries(obj).map(([key, value]: [string, any]) => [key, deepClone(value)])
)
}
// 基本类型
return obj
}