为什么const定义的对象是可变的

407 阅读1分钟

今天被同事问到了一个问题 为什么const定义一个数组后,可以往数组中push新元素.

const定义的内容是不可以改变的,这是大多数人认可的.因为const是定义一个常量,常量是不可修改的

但是const定义的内容有一部分是可以改变的.

首先const做的事是在栈中开辟存储空间并保存数据.

不可改变的是const定义的基础数据类型,像string,number,boolean,undefind,null.这些数据存储都是直接存储在栈中的.

可改变的是const定义的复杂数据类型.arrry,object,function.这些数据存储在堆中,const存储的是栈中的地址.当数据发生改变时,本质上是改变堆中的数据.但栈中的地址是不会发生改变的.

在这个问题中,当我们定义完一个数组后,再往数组中push新元素时,本质上改变是在堆中存储的数据.而此时栈中存储的地址并不会发生改变

如下图所示:

ox1111 是存储的地址,我随便写的,就是一个地址

无标题.png

const arr=[1,2]
arr.push(3)
console.log(arr)//[1,2,3]

const arr=[1,2]这一行代码做的事是:

image.png

arr.push(3)这一行做的事是图右边

image.png