类型介绍

javascript中,内存空间分为栈内存(stack)和堆内存(heap)。其中栈内存存放基本类型(undefined、null、boolean、number、string、symbol),堆内存存放复杂类型(array、object、function、RegExp、Date)

栈内存

基本类型数据都是保存在计算机的栈内存,值都是有固定的大小,通过按照值来访问由系统自动分配和自动释放。好处就是内存可以机制得到回收。

  1. // 栈内存
  2. let num = 1;
  3. let str = 'string';
  4. let bool = true;
  5. let sym = Symbol(1);
  6. let un = undefined;

栈内存图解

image.png

堆内存

引用类型保存在堆内存中,值大小不固定。栈内存中存放该 引用类型的访问地址 。因为JavaScript不允许直接访问堆内存中的位置,因此操作对象时,其实操作的是栈内存的对象的引用。

  let obj = {}
  let arr = [];
  function fun(){}
  let date = new Date()
  let reg = new RegExp()

堆内存图解

栈内存和堆内存 - 图2

栈和堆区别何在?

栈内存

在栈里面我们存放的都是真实的值,所以如果重新赋值一份的话,是真实的把基本类型的值,赋值了一份。所以结合下面代码,b是真实的复制了一份a。直接修改b的之后a是不会被修改的。

let a = 1;
let b = a;
b = 2;
console.log(a);    //    1
console.log(b)    //    2

堆内存

在堆中,因为堆的值存在堆里面没错。但是堆的指针是存在 栈内存中 ,当我们把arr赋值给newArr其实是把 栈内存的指针 赋值了一份。所以arr和newArr都还是指向相同的堆地址。所以修改newArr后arr是会被修改掉的

堆内存范围过程

  • 从栈中获取该对象的地址引用
  • 再从堆内存中取得我们需要的数据
    let arr = [1,2,3];
    let newArr = arr;
    newArr[2] = 9;
    console.log(arr)  //  [1, 2, 9]
    console.log(newArr) //  [1, 2, 9]