深浅拷贝

先来了解一下这些:在js中变量类型基本分为两种:基本数据类型和引用数据类型;
基本类型:Underfied Null Boolean Number String。(保存在栈内存)
引用类型:可能包含多个值的对象。(保存在堆内存中)
根本原因在于保存在栈内存的必须是大小固定的数据,引用类型的大小不固定,只能保存在堆内存中,但是我们可以把它的地址写在占内存中以供我们访问。
深浅拷贝:
浅拷贝:1)在复制基本数据类型时,我们直接使用=完成复制
2)在引用类型的时候,我们循环遍历对象,对每个属性或值使用=完成复制
深拷贝:深复制实现的方式:对属性中所有引用类型的值,遍历到是基本类型的值为止,从这种方式上,我们很容易就可以想到利用递归来实现深复制。

function deepCopy (obj) {
    var result;

    //引用类型分数组和对象分别递归
    if (Object.prototype.toString.call(obj) == '[object Array]') {
      result = []
      for (i = 0; i < obj.length; i++) {
        result[i] = deepCopy(obj[i])
      }
    } else if (Object.prototype.toString.call(obj) == '[object Object]') {
      result = {}
      for (var attr in obj) {
        result[attr] = deepCopy(obj[attr])
      }
    }
    //值类型直接返回
    else {
      return obj
    }
    return result
}

对于深浅复制的区别,其实核心的关键点就是是只复制了第一属性还是完全复制了所有的属性,使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。
因此,slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝
转载于https://segmentfault.com/a/1190000008838101

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • underscore 的源码中,有很多地方用到了 Array.prototype.slice() 方法,但是并没有...
    theCoder阅读 610评论 0 1
  • 在网上浏览了不少关于深浅拷贝的解析,在此,要总结的几点内容大致如下: 基本类型和引用类型 浅拷贝与深拷贝的区别 常...
    Weastsea阅读 630评论 0 3
  • 简单讲呢,深浅拷贝,都是进行复制,那么区别主要在于复制出来的新对象和原来的对象是否会互相影响,改一个,另一个也会变...
    _千寻瀑_阅读 264评论 0 2
  • 世界上最温柔的风 就是车速达到66迈左右不多不少的时候 手伸出窗外大概一个手掌的距离不长不短 那触不可及的风在你手...
    Rush_she阅读 304评论 0 0
  • 1.配置 root的build.gradle 2.配置module的build.gradle 3.继续配置modu...
    Wang_Mr阅读 425评论 0 0