堆&栈
堆是堆内存(heap)的简称,栈是栈内存(stack)的简称。
- javascript的基本数据类型都是按值存储在栈内存中,每种类型的数据占用的空间大小都是确定的。
- javascript的引用数据类型是存储在堆内存中,其实,说存储在堆内存中也不太准确,因为引用数据类型的内存地址是存储在栈内存中,当我们想要访问引用数据类型的值的时候,需要先从栈内存中获得对象的内存地址,然后在通过内存地址找到所需要的数据。
栈中的基本数据类型
基本数据类型的值保存在栈内存中。访问方式是按值访问
var name = ‘oralinge’
更改name的值
name = 123
从1、2中我们可以看出,改变变量的值只操作变量实际保存的值,并不会开辟新的地址。
基本类型变量的复制
var b= name;
从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上。
更改变量b的值
b = ‘oralinge’
堆中的引用数据类型
引用数据类型值指保存在堆内存中的对象。也就是,变量中保存的实际上的只是一个指针,这个指针指向内存中的另一个位置,该位置保存着对象。访问方式是按引用访问。
指针与地址
如下示例:
var obj = new Object();
存于栈中的指针指向堆内存的引用数据类型
键值对
obj.name = ‘oralinge’
引用数据类型的复制
var b = obj
引用类型变量的复制,其实复制的是存储在栈中的指针,将指针复制到栈中新变量分配的空间中。这个指针副本和原指针指向存储在堆中的同一个地址。复制操作结束后,两个变量实际上将引用同一个对象。因此,无路不能你在操作哪个变量,使得地址中的值发生改变,另一个变量也会受到影响。
命运共同
b.name = ‘我是name’
var obj = new Object()
obj.name = 'oralinge'
console.log(obj,1)// {name: "oralinge"} 1
var b = obj
console.log(b,2)// {name: "oralinge"} 2
b.name = '我是name'
console.log(b,3)// {name: "我是name"} 3
console.log(obj,4)// {name: "我是name"} 4