最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS--浅拷贝和深拷贝

    正文概述 掘金(passing)   2021-01-05   349

    1. 浅拷贝,基本类型复制值,引用类型复制引用,若源数据或拷贝后的数据的引用类型的值发生变化,则另一方随之改变。

    // 浅拷贝
    
    function clone(target) {
      let cloneTarget = {}
      for (let key in target) {
        cloneTarget[key] = target[key]
      }
      return cloneTarget
    }
    
    // test
    let obj = {a: 1}
    
    let obj2 = {b: obj}
    
    let cloneObj2 = clone(obj2)
    
    cloneObj2.b.a = 2
    
    console.log(obj)    // {a: 2}
    

    2. 深拷贝,如果是基本类型则直接返回,如果是引用类型就创建一个新对象,遍历需要克隆的对象,将需要克隆的对象的属性执行深拷贝后依次添加到新对象上。考虑到循环引用问题,需要创建一块内存空间来存储已经克隆过的对象,在克隆对象之前先去这块空间里找一下有没有克隆过,有的话就返回,没有的话就把当前对象作为 key, 克隆对象作为 value 进行存储,再继续克隆。

    //深拷贝
    
    function clone(target, map = new WeakMap()) {
      if (typeof target === 'object' || typeof target === 'function' && target !== null) {
        let cloneTarget = Array.isArray(target) ? [] : {}
    
        if (map.get(target)) {
          return map.get(target)
        }
    
        map.set(target, cloneTarget)
    
        for (let key in target) {
          cloneTarget[key] = clone(target[key], map)
        }
    
        return cloneTarget
      } else {
        return target
      }
    }
    

    当然,大部分情况下都可以使用序列化对象的方式,但这种方式不能正确处理函数、正则、循环引用等情况

    JSON.parse(JSON.stringify(target))
    

    起源地下载网 » JS--浅拷贝和深拷贝

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元