Javascript中的堆内存和栈内存
了解堆栈前一定要知道js的变量类型,注意一定要区分变量类型和数据类型,虽说类型但是不能搞混了
借用JavaScript高级程序设计中的概念:
ECMAScript变量包含两种不同类型的数据:原始值和引用值。原始值就是最简单的数据(Undefined、Null、Boolean、Number、String、Symbol),引用值则是由多个值构成的对象(Object(object,array)、Function)。
在把一个值赋值给变量时,Javascript引擎必须确定这个值是原始值还是引用值。保存原始值的变量是按值访问的,因为我们操作的就是存储在变量中的实际值。
引用值是保存在内存中的对象。与其他语言不同,Javascript不允许直接访问内存位置,因此也就不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用而非实际的对象本身。为此,保存引用值的变量是按引用访问的。
更详细的请自行阅读javaScript高级程序设计中的第四章。
为了更方便理解下文中的原始值以字符串来举例,引用值以对象来举例
那么变量既然区分出原始值和引用值了,那么就可以说说存储了,简单点就是说字符串是存储在栈内存中的,而对象是存储在堆内存的中,那么我们访问变量的时候访问的都是栈内存,只不过在创建对象变量的时候,js在堆内存中创建的同时,在栈内存中也创建了一个指针(不好理解就直接理解成该对象在堆内存中的地址),这个指针就是指向堆内存中的对象本身。下图可以体现出以上说的