且根结点的两个子树也是一个堆
栈内存和堆内存在了解一门语言底层数据布局上,挺重要的,做了个总结
JS中的栈内存堆内存JS的内存空间分为栈(stack)、堆(heap)、池(一般也会归类为栈中)。
此中栈存放变量,堆存放庞大东西,池存放常量,所以也叫常量池。
栈数据布局栈是一种特殊的列表,栈内的元素只能通过列表的一端访谒,这一端称为栈顶。栈被称为是一种后入先出(LIFO,last-in-first-out)的数据布局。由于栈具有后入先出的特点,所以任何不在栈顶的元素都无法访谒。为了得到栈底的元素,必需先拿失上面的元素。
堆数据布局堆是一种颠末排序的树形数据布局,每个结点都有一个值。
凡是我们所说的堆的数据布局,是指二叉堆。
堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。
由于堆的这个特性,常用来实现优先行列队伍,堆的存取是随意,这就如同我们在藏书楼的书架上取书,
虽然书的摆放是有挨次的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,
我们只需要关心书的名字。
Sting
Number
Boolean
null
undefined
Symbol
根基数据类型生存在栈内存中,因为根基数据类型占用空间小、巨细固定,通过按值来访谒,属于被频繁使用的数据。
let num1 = 1; let num2 = 1; // 闭包中的根基数据类型变量不生存在栈内存中,而是生存在堆内存中
引用数据类型Array,Function,Object...可以认为除了上文提到的根基数据类型以外,所有类型都是引用数据类型。
引用数据类型存储在堆内存中,因为引用数据类型占据空间大、巨细不固定。
如果存储在栈中,将会影响措施运行的性能;
引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地点。
当解释器寻找引用值时,会首先检索其在栈中的地点,取得地点后从堆中获得实体
// 根基数据类型-栈内存 let a1 = 0; // 根基数据类型-栈内存 let a2 = ‘this is string‘; // 根基数据类型-栈内存 let a3 = null; // 东西的指针存放在栈内存中,指针指向的东西存放在堆内存中 let b = { m: 20 }; // 数组的指针存放在栈内存中,指针指向的数组存放在堆内存中 let c = [1, 2, 3];
let a = 20; let b = a; b = 30; console.log(a); // 20
a、b 都是根基类型,它们的值是存储在栈内存中的,a、b 分袂有各自独立的栈空间, 所以改削了 b 的值以后,a 的值并不会产生变革。
let m = { a: 10, b: 20 }; let n = m; n.a = 15; console.log(m.a) // 15
m、n都是引用类型,栈内存中存放地点指向堆内存中的东西, 引用类型的复制会为新的变量自动分配一个新的值生存在变量中, 但只是引用类型的一个地点指针而已,实际指向的是同一个东西, 所以改削 n.a 的值后,相应的 m.a 也就产生了转变。
在JS中,根基数据类型变量巨细固定,并且操纵简单容易,所以把它们放入栈中存储。
引用类型变量巨细不固定,所以把它们分配给堆中,让他们申请空间的时候本身确定巨细,qq怎么破解空间权限
,这样把它们分隔存储能够使得措施运行起来占用的内存最小。
栈内存由于它的特点,所以它的系统效率较高。
堆内存需要分配空间和地点,还要把地点存到栈中,所以效率低于栈。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/27377.html
- 上一篇:4GB以上超大文件上传和断点续传处事器的源码
- 下一篇:div就是个这样的存在