类型介绍
javascript中,内存空间分为栈内存(stack)和堆内存(heap)。其中栈内存存放基本类型(undefined、null、boolean、number、string、symbol),堆内存存放复杂类型(array、object、function、RegExp、Date)
栈内存
基本类型数据都是保存在计算机的栈内存,值都是有固定的大小,通过按照值来访问由系统自动分配和自动释放。好处就是内存可以机制得到回收。
// 栈内存
let num = 1;
let str = 'string';
let bool = true;
let sym = Symbol(1);
let un = undefined;
栈内存图解
堆内存
引用类型保存在堆内存中,值大小不固定。栈内存中存放该 引用类型的访问地址
。因为JavaScript不允许直接访问堆内存中的位置,因此操作对象时,其实操作的是栈内存的对象的引用。
let obj = {}
let arr = [];
function fun(){}
let date = new Date()
let reg = new RegExp()
堆内存图解
栈和堆区别何在?
栈内存
在栈里面我们存放的都是真实的值,所以如果重新赋值一份的话,是真实的把基本类型的值,赋值了一份。所以结合下面代码,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]