今天被同事问到了一个问题 为什么const定义一个数组后,可以往数组中push新元素.
const定义的内容是不可以改变的,这是大多数人认可的.因为const是定义一个常量,常量是不可修改的
但是const定义的内容有一部分是可以改变的.
首先const做的事是在栈中开辟存储空间并保存数据.
不可改变的是const定义的基础数据类型,像string,number,boolean,undefind,null.这些数据存储都是直接存储在栈中的.
可改变的是const定义的复杂数据类型.arrry,object,function.这些数据存储在堆中,const存储的是栈中的地址.当数据发生改变时,本质上是改变堆中的数据.但栈中的地址是不会发生改变的.
在这个问题中,当我们定义完一个数组后,再往数组中push新元素时,本质上改变是在堆中存储的数据.而此时栈中存储的地址并不会发生改变
如下图所示:
ox1111 是存储的地址,我随便写的,就是一个地址
const arr=[1,2]
arr.push(3)
console.log(arr)//[1,2,3]
const arr=[1,2]这一行代码做的事是:
arr.push(3)这一行做的事是图右边