为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2019-02-26 21:40:54
在看const定义常量的时候发现,const定义基本类型的时候,再改变该值会报错,但是定义对象或数组的时候,对象和数组改变却不会报错,es6里的解释是const保存的是指向数组或对象的指针。我又搜了下栈内存和堆内存,发现其实变量保存的基本类型和引用类型的指针都是放在栈内存里的,const实质是不是就是栈内存不能变,而对象和数组的指针存在栈内存里没变,但是存在堆内存的数据本体随便更改是没事的?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

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


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


var a = 2

var obj = {

    prop: 5

}

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


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


对于a, 就是栈上存一个a变量, a存储的值为2

对于obj,可以拆分成两部分, 一部分是堆中(也就是{prop: 5})这一部分, 另一部分在栈中(obj这一部分)。

这里我们不分析堆中的, 只管栈这一部分,那么obj可以看成是一个存储这地址的“简单数据类型”(因为一个地址占的字节数和简单数据类型差不多),obj的值为0x10000000这样

假设执行obj.prop = 6, 实际上是改变了{prop: 5}这一部分, 而obj的值并没有改变。依然是0x10000000, 数组的原理与之类似

当你执行obj = {key: 'foo'}, 是在堆中开辟了一个新的对象,然后把地址赋给了obj, 那obj的值肯定就变了, 那以前{prop: 5}这一部分去哪里了呢? 被垃圾回收给清除了


查看完整回答
反对 回复 2019-03-08
?
动漫人物

TA贡献1815条经验 获得超10个赞

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

查看完整回答
反对 回复 2019-03-08
  • 2 回答
  • 0 关注
  • 1238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信