js 数据在内存中的存储

2,523 阅读2分钟

计算机存储分为内存RAM和外存ROM(硬盘), 计算机调取数据是从内存中调取,因为它速度更快,而内存中的数据从外存中调取。 内存中又分为两块区域,一个是栈,一个是堆。

js中的数据类型,按构造分为两种:1、简单类型;2、复杂类型。 简单数据类型直接存在栈里面。

数值

var a = 1
var b = a
var c = 1
a === b
a === c
b = 2

var a = 1 会在栈上开辟一个空间a去存储数值类型1,a就是用来调用这个值的名字。

var b = a 会在栈上开辟另一个空间b去存储数值类型1。

var c = 1 会在栈上开辟另一个空间c去存储数值类型1。

a === b && a === c 返回true,因为比较的是 a b c 三个空间在栈中存的值。

b = 2 改变b空间中存的数值,并不会影响到a。

字符

var s = 'abc'
var str = s
str = 'def'

var s = 'abc' 在栈上开辟一个空间s去存储字符类型'abc',s就是用来调用这个值的名字。

var str = s 在栈上开辟另一个空间str去存储字符类型'abc'。

str = 'def' 与数值类型不一样的是这时不是改变空间str内的字符值,而是开辟一个新的空间去存储def,str变量名指向新的空间。原来那个空间由于没有对应的变量名去调用了,浏览器会将其删除。

对象

var obj = {
    name: 'yhq',
    age: 18
}
var obj2 = obj
obj2.age = 20

var obj = {name: 'yhq', age: 18} obj这个对象值存在堆中,栈上存的是找到这个对象值的地址address1。

var obj2 = obj 在栈上开辟一个新的空间obj2存储值为地址address1。

obj2.age = 20 在栈内拿到对象的地址address1,通过地址找到堆中对象并且改变其age属性。 这时访问obj.age也变成了20。

当一个对象已经没有被引用了,那么会被当做垃圾被回收

数组和函数

数组和函数存储与对象是一样的,数组和函数又对应一个复杂对象