web工具函数系列 - 深拷贝

399 阅读1分钟

背景

面试官:您好,请用ts实现一个深拷贝

小A:好的
深拷贝:

  1. 分不同的类型
  2. 并且还需要递归

TS:

  1. 需要使用到一些高阶用法

代码

const deepCopy = <T>(target: T): T => {
  if(target === null) {
    return target
  }
  if(target instanceof Date) {
    return new Date(target.getTime()) as any
  }
  if(target instanceof Array) {
    const cp = [] as any[]
    (target as any[]).forEach(v => cp.push(v))
    return cp.map((n: any) => deepCopy<any>(n)) as any
  }
  if(typeof target === 'object' && target !== {}) {
    const cp = {...(target as {[keystring]: any})} as { [keystring]: any }
    Object.keys(cp).forEach(k => {
      cp[k] = deepCopy<any>(cp[k])
    })
    return cp as T
  }
}

总结

  1. 判断了null,Date,Array,object
  2. 在Array,object类型下,值也需要进行deepCopy,也就是递归去负值