今天来说一下自己对于堆和栈的理解。
首先JavaScript中的变量分为基本类型和引用类型。
基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。
1、基本类型
基本类型有Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
例如:
let a = '张三'
let b = '张三'
console.log(a==b)//ture
console.log(a===b)//ture
2、引用类型
引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。
所以值看似相同的两个对象实际上却不相等:因为是不同对象,所以在栈中留存的堆地址
不同,//a==b优先比较堆内容。
let a ={
name : '张三',
id :007
}
let b ={
name : '张三',
id :007
}
console.log(a==b)//false
console.log(a===b)//false
let a = 10
let b = a //复制a的值给b
b = 20 //改变b值,a不变
除了对象外,数组也是:因为a储存的数组变了,所以地址也变化了,所以a,b不同。
let a = [1,2,3]
let b = a
console.log(a,b)//[ 1, 2, 3 ] [ 1, 2, 3 ]
a = [5,6]
console.log(a,b);//[ 5, 6 ] [ 1, 2, 3 ]
!!!!!!!总结:引用对象是同一引用对象的情况下,栈(也就是存放引用对象地址的变量所在)中的地址不发生变化,如果引用对象不同,则堆地址(变量储存的地址也不相等)不同。