本文源自公众号: 高级前端进阶 1-3,木易杨的内容,这边做下记录与一点自己的理解
栈数据结构
栈的结构就是后进先出(LIFO),如图
堆数据结构
堆数据结构是一种树状结构,存在类似图书与书架非常相识,我们只需要知道书名,取值key-value
对列
对列是一种先进先出(FIFO)的数据结构,这是事件循环(Event Loop)的基础结构
1、基本类型 --> 保存在栈内存中,因为这些类型在内存中分别占有固定大小的空间,通过按值来访问。基本类型一共有6种:Undefined、Null、Boolean、Number 、String和Symbol
2、引用类型 --> 保存在堆内存中,因为这种值的大小不固定,因此不能把它们保存到栈内存中,但内存地址大小的固定的,因此保存在堆内存中,在栈内存中存放的只是该对象的访问地址。当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
var a = 20;
var b = a;
b = 30;
// 这时a的值是多少?
// a为20,因为为基本类型,它的值存储在栈中
var a = { name: '前端开发' }
var b = a;
b.name = '进阶';
// 这时a.name的值是多少
// 因为a 和 b都是指向同一个堆, 公用一个堆,所以 a.name 为 进阶
var a = { name: '前端开发' }
var b = a;
a = null;
// 这时b的值是多少
// b为 {name: '前端开发'},因为此时只是改变了a的指向地址,b的指向地址不变
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
a.x // 这时 a.x 的值是多少
b.x // 这时 b.x 的值是多少
// 从运算优先级讲, . 的优先级大于 = ,所以在堆中创建了一个 x,此时堆的内容为 {n: 1, x: undefined}, 然后从右往左赋值,a的指向被重新指向了 {n:2}这个堆, a.x实际为原本堆的x,所以此时 堆,x = {n:2},记住一个,对象是引用!!!
// a.x 为undefined
// b.x 为 {n: 2}