前端开发之 js 栈内存和堆内存的区别
js 中的堆内存与栈内存
在 js 引擎中对变量的存储主要有两种位置,堆内存和栈内存。
和 java 中对内存的处理类似,栈内存主要用于存储各种基本类型的变量,包括 Boolean、Number、String、Undefined、Null,**以及对象变量的指针,java培训这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等。
而堆内存主要负责像对象 Object 这种变量类型的存储。
栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。而堆内存存储的对象类型数据对于大小这方面,一般都是未知的。
为什么 const 定义的值部分能改,部分不能改
当我们定义一个 const 对象的时候,java培训我们说的常量其实是指针,就是 const 对象对应的堆内存指向是不变的,但是堆内存中的数据本身的大小或者属性是可变的。而对于 const 定义的基础变量而言,这个值就相当于 const 对象的指针,是不可变。
为什么 const、let 定义的变量不能二次定义
每次使用 const 或者 let 去初始化一个变量的时候,会首先遍历当前的内存栈,看看有没有重名变量,有的话就返回错误。
new 关键字初始化的之后是不是存储在栈内存中
根据构造函数生成新实例,这个时候生成的是对象,而不是基本类型。
let str1 = new String('123')
let str2 = new String('123')
console.log(str1==str2, str1===str2) // false false
很明显,如果 str1 ,str2 是存储在栈内存中的话,两者应该是明显相等的,但结果两者并不相等,说明两者都是存储在堆内存中的,指针指向不一致。
值类型和引用类型其实说的就是栈内存变量和堆内存变量;值传递和引用传递、深拷贝和浅拷贝,都是围绕堆栈内存展开的,一个是处理值,一个是处理指针。
内存分配和垃圾回收
一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
垃圾回收:栈内存变量基本上用完就回收了,而推内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。
文章来源全栈弄潮儿
评论