封装深拷贝函数

深拷贝函数

function isObject(value) {
  const valueType = typeof value
  return (value !== null) && (valueType === "object" || valueType === "function")
}

function deepClone(originValue) {
  // 判断是否是一个Set类型
  if (originValue instanceof Set) {
    return new Set([...originValue])
  }

  // 判断是否是一个Map类型
  if (originValue instanceof Map) {
    return new Map([...originValue])
  }

  // 判断如果是Symbol的value, 那么创建一个新的Symbol
  if (typeof originValue === "symbol") {
    return Symbol(originValue.description)
  }

  // 判断如果是函数类型, 那么直接使用同一个函数
  if (typeof originValue === "function") {
    return originValue
  }

  // 判断传入的originValue是否是一个对象类型
  if (!isObject(originValue)) {
    return originValue
  }

  // 判断传入的对象是数组, 还是对象
  const newObject = Array.isArray(originValue) ? []: {}
  for (const key in originValue) {
    newObject[key] = deepClone(originValue[key])
  }

  // 对Symbol的key进行特殊的处理
  const symbolKeys = Object.getOwnPropertySymbols(originValue)
  for (const sKey of symbolKeys) {
    // const newSKey = Symbol(sKey.description)
    newObject[sKey] = deepClone(originValue[sKey])
  }
  
  return newObject
}

用法 const newObj = deepClone(obj) obj是要深拷贝的对象
newObj 这个是拷贝出来的对象

在vue项目中使用

export default {
  isObject(value) {
    const valueType = typeof value
    return (value !== null) && (valueType === "object" || valueType === "function")
  },
  
  deepClone(originValue) {
    // 判断是否是一个Set类型
    if (originValue instanceof Set) {
      return new Set([...originValue])
    }
  
    // 判断是否是一个Map类型
    if (originValue instanceof Map) {
      return new Map([...originValue])
    }
  
    // 判断如果是Symbol的value, 那么创建一个新的Symbol
    if (typeof originValue === "symbol") {
      return Symbol(originValue.description)
    }
  
    // 判断如果是函数类型, 那么直接使用同一个函数
    if (typeof originValue === "function") {
      return originValue
    }
  
    // 判断传入的originValue是否是一个对象类型
    if (!this.isObject(originValue)) {
      return originValue
    }
  
    // 判断传入的对象是数组, 还是对象
    const newObject = Array.isArray(originValue) ? []: {}
    for (const key in originValue) {
      newObject[key] = this.deepClone(originValue[key])
    }
  
    // 对Symbol的key进行特殊的处理
    const symbolKeys = Object.getOwnPropertySymbols(originValue)
    for (const sKey of symbolKeys) {
      // const newSKey = Symbol(sKey.description)
      newObject[sKey] = this.deepClone(originValue[sKey])
    }
    
    return newObject
  }
}
import deepClone from '目录'
使用deepClone.deepClone(深拷贝的对象)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值