计算机存储分为内存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。
当一个对象已经没有被引用了,那么会被当做垃圾被回收
数组和函数
数组和函数存储与对象是一样的,数组和函数又对应一个复杂对象