在看const定义常量的时候发现,const定义基本类型的时候,再改变该值会报错,但是定义对象或数组的时候,对象和数组改变却不会报错,es6里的解释是const保存的是指向数组或对象的指针。我又搜了下栈内存和堆内存,发现其实变量保存的基本类型和引用类型的指针都是放在栈内存里的,const实质是不是就是栈内存不能变,而对象和数组的指针存在栈内存里没变,但是存在堆内存的数据本体随便更改是没事的?
在看const定义常量的时候发现,const定义基本类型的时候,再改变该值会报错,但是定义对象或数组的时候,对象和数组改变却不会报错,es6里的解释是const保存的是指向数组或对象的指针。我又搜了下栈内存和堆内存,发现其实变量保存的基本类型和引用类型的指针都是放在栈内存里的,const实质是不是就是栈内存不能变,而对象和数组的指针存在栈内存里没变,但是存在堆内存的数据本体随便更改是没事的?
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
跟堆与栈没有关系, 真正的区别在于简单数据类型和引用数据类型的差异
假设有两个变量
a
和obj
,分别是Number和Object类型严格来说, JS并没有区分什么数据类型放在堆,什么数据类型放在栈(不过你可以这么想, 这里我们就假设简单数据类型是在栈,引用数据类型是在堆)
整个内存的分配你可以这么假想(实际的比这复杂得多):
0x10000000
这样obj.prop = 6
, 实际上是改变了{prop: 5}这一部分, 而obj的值并没有改变。依然是0x10000000
, 数组的原理与之类似obj = {key: 'foo'}
, 是在堆中开辟了一个新的对象,然后把地址赋给了obj, 那obj的值肯定就变了, 那以前{prop: 5}这一部分去哪里了呢? 被垃圾回收给清除了