天天看点

谈谈 js 深浅拷贝 那点事(一)

深拷贝与浅拷贝 不知道大家是咋理解的 有没有从内存空间角度去理解 前天看了一个内存空间 堆栈 下面卖弄下

在学习数据结构时候 堆栈是很熟悉了 在一端去对数据的操作

简单说 栈为自动分配内存空间 由系统自动释放

堆是动态分配的内存 大小不定也不会自动释放

  • 栈数据结构

    网上好的例子

上图很详细的说明了栈数据结构空间的存储

对于栈来说 栈的数据操作 都要在栈顶来操作

  • 堆数据结构

上面可以看到都是散落的

对于堆来说 数据项没有固定顺序 不想栈一样有顺序 在堆操作数据可以任何顺序操作 不需要必须在顶部来操作

  • js 数据类型 和堆 栈

    js中数据类型分为两类

    1. 基本类型: Undefined Null Boolean Numer String 5种基本数据类型放在栈内存中简单数据段 数据大小确定 内存空间自动分配
      var name = 'jozo'
      var city = 'gaungzhou'
      var age = 22复制代码
                 

      上面有几个基本类型变量 在内存中结构

      内存中 包括了变量的 标识 和 值

  1. 引用类型: Object Array fun 这些引用类型 比如数组 他们的值大小是不固定的 这些放在堆内存中 js是不允许直接访问堆内存因此不能直接操作对象堆内存空间 在变量中实际上保存一个指针 这个指针指向另一个位置 实际要操作的是一个指针 不是实际对象 这个地址跟堆内存的实际值相关联
    var a = 20
       var b = 'abc'
       var c = true
       var d = { m:20 }复制代码
               

上图可以看到 当要访问对内存中引用类型时候 实际上从变量对象中获取这个对象地址指针 然后从堆内存中获取数据

上面js中的数据类型内存存储
  • 数据类型特性
    1. 看基本数据类型
      var a = 1
      var b = a
      b = 2   //a还是1复制代码
                 
      基本数据类型保存在栈中 系统自动为变量分配一个值 a b 都是1 但是他们是栈中两个相互对立的东西 所以修改b 对于a来说没有影响
    2. 看引用数据类型
      var m = { a: 10, b: 20 }
      var n = m
      n.a = 15复制代码
                 

      引用类型真正的对象保存在堆中 var m = {} 在栈中保存了一个标识跟值 根据上述说的引用类型栈中变量对象保存是一个 堆内存的指针地址

      var n = m 这里栈中自动为其分配一个空间 也是保存一个标识跟值 值也是保存的一个指针地址

      n.a = 15 改变了n的a属性 虽然栈中保存的两个相互独立东西 但是指针指向堆内存是对象是一样的 就导致了 m 也改变了

可以看到如果通过这种方式来看的话 引用类型 基本类型本质上的区别 按值 按址

下一篇拷贝实际例子

参考链接:

内存空间详细图解