Js 堆内存和栈内存
const 定义的值能改吗? 部分能改,部分不能改,在 const 定义的基本类型不能改变,,但定义的对象可以通过修改对象属性或方法可以修改。
Js 引擎对变量的存储有两种,堆内存和栈内存
栈内存主要用于存储各种基本类型的变量。(string,boolean,undefined,null,number),以及对象变量的指针。一个线性排列的空间每个大小都一样 堆内存主要像对象(object)这样的变量存储。没个空间大小不一样。
当我们定义一个 const 对象时,我们说的常量就是指针,就是 const 对象对应的堆内存的指针指向不变,堆内存中的数据大小或者属性可变。而 const 定义基础变量,这个值相当于 const 对象的指针是不可变的
因此,每次 const 或 let 初始化定义一个变量时,就会遍历当前的内存栈,看看有没有当前重名的变量,有的话就会报错。
使用 new 初始化的不存在栈内存中。因为 new 是根据构造函数生成的新实例,是对象而不是基本类型
var aa = new String(‘123’); console.log(typeOf(aa)) // ‘object’
Var bb = newString(‘123’); aa == bb; aa === bb // false false
如果 aa 和 bb 存储在栈内存中的话 肯定是相等的,但结果不相等所以存储在堆内存中,指针指向不一致
所以我们经常说的值类型和引用类型就是栈内存变量和堆内存变量,值传递,引用传递。深拷贝和浅拷贝都是围绕堆和栈展开的,一个处理值一个处理指针。
分配和来及回收
堆内存:动态分配内存,内存大小不一也不会自动释放。首先要再堆内存中 新分配存储空间,之后再把指针存储到栈内存中,效率相对低一些
栈内存:自动分配相同大小的内存空间,并由系统自动释放、属于线性有序存储,容量小,系统分配率高。