JS中的变量有基本类型和引用类型两种。
基本类型数据有包括Boolean、Number、String、Undefined、Null等,他们都是保存在 栈空间,通过按值引用。
引用类型就是一些对象类型,如Object对象等,他们存储在 堆 中,Js不允许直接访问堆内存中的位置,所以操作对象时,实际是操作对象的引用。
JS引擎的存储有两种:堆内存和栈内存。
栈内存:存储基本类型的变量,还有对象的指针,也是存储在栈内存中。
堆内存:存储引用类型数据,如Object对象等。
使用 const 定义变量的时候,这个变量其实是一个对象的指针,它指向对应的堆内存,堆内存指向是不能变的,所以const定义的变量是不能改变的;但是堆内存存储的数据本身是可以改变的,包括大小、属性等,所以const定义的变量的属性值是可以改变的。
我们都知道,使用 let 或者 const 定义的变量不能进行二次定义,即:
结合上边内容就很好理解了。使用let 或者 const 定义变量的时候,js引擎会遍历当前内存栈,如果有重名变量,就会报错,没有的话才能创建新的变量。
还有一点:new 关键词创建的对象不会存储在 栈内存中,如下:
这是因为,new作为一个构造函数,生成的是一个Object对象,而Object对象是存储在 堆内存中的,