js内存图

栈(stack)

  • 基本类型是保存在栈内存中的简单的数据段,数据大小确定并且占有固定大小的空间,它们是按值存放的,所以可以直接访问。基本类型有Number , String , Null , Undefined , Boolean , symbol。
  • 基本类型的拷贝是传值

    1
    2
    3
    4
    5
    6
    var a = 1
    var b = 2
    b = a
    a = 8
    // 此时b的值为1
    *基础类型的变量发生复制行为时,直接把a对应的值copy给b,b=1。它们两个变量的值是相互独立不影响的,所以当改变a的值为8时,b的值不会跟着改变仍然为1

堆(heap)

  • 引用类型(复杂类型),即Object(数组,对象,函数等),它们的值是不固定的,存储方式是在堆内存中存储对象,在栈内存中存储该对象的地址(该地址指向对应的对象)

  • 复杂类型的拷贝是传址

    1
    2
    3
    4
    5
    6
    var a = {m:10}
    var b = {n:20}
    b = a
    a.k = 30
    b = {m:10 , k:30}
    *复杂类型的变量发生复制时,复制的是栈内存中的地址,然后指向堆内存中的同一个对象,所以当对象内容发生变化时,两者都会相应地发生改变。

浅拷贝(把栈里面的东西拷贝一遍)

如上面举的例子,b拷贝了a后,它们同时指向同一个内存,此时只要改变a或b其中任何一个变量的值,另外一个值就会跟着改变,这种就是浅拷贝。

深拷贝(把堆里面的东西拷贝一遍)

b拷贝了a后,在堆内存中重新开辟一个内存来存储b的值,此时指向不同的地址,相互独立。