es6的const定义的常量不能更改该怎么理解?

在看const定义常量的时候发现,const定义基本类型的时候,再改变该值会报错,但是定义对象或数组的时候,对象和数组改变却不会报错,es6里的解释是const保存的是指向数组或对象的指针。我又搜了下栈内存和堆内存,发现其实变量保存的基本类型和引用类型的指针都是放在栈内存里的,const实质是不是就是栈内存不能变,而对象和数组的指针存在栈内存里没变,但是存在堆内存的数据本体随便更改是没事的?

阅读 8.5k
3 个回答

跟堆与栈没有关系, 真正的区别在于简单数据类型引用数据类型的差异

假设有两个变量aobj,分别是Number和Object类型

var a = 2
var obj = {
    prop: 5
}

严格来说, JS并没有区分什么数据类型放在堆,什么数据类型放在栈(不过你可以这么想, 这里我们就假设简单数据类型是在,引用数据类型是在

整个内存的分配你可以这么假想(实际的比这复杂得多):

  1. 对于a, 就是栈上存一个a变量, a存储的值为2
  2. 对于obj,可以拆分成两部分, 一部分是堆中(也就是{prop: 5})这一部分, 另一部分在栈中(obj这一部分)。
  3. 这里我们不分析堆中的, 只管栈这一部分,那么obj可以看成是一个存储这地址的“简单数据类型”(因为一个地址占的字节数和简单数据类型差不多),obj的值为0x10000000这样
  4. 假设执行obj.prop = 6, 实际上是改变了{prop: 5}这一部分, 而obj的值并没有改变。依然是0x10000000, 数组的原理与之类似
  5. 当你执行obj = {key: 'foo'}, 是在堆中开辟了一个新的对象,然后把地址赋给了obj, 那obj的值肯定就变了, 那以前{prop: 5}这一部分去哪里了呢? 被垃圾回收给清除了

1,如果是值类型,值不可变
2.如果是引用类型,地址不可变

一句话:指针不变
简单来说:不能再用=。但是对于数组、对象、函数、正则、Set、Map之类的可以更改、删除属性(configurable为true的情况)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏