javascript高级篇之const的数组和对象为什么可以改变

991 阅读2分钟

前言

const是ES6新诞生的关键字,用于定义一个常量,也是平常项目中用的最多的一种变量声明方式。

const的特点是:必须进行初始化赋值,且赋值以后不可更改。

本文拿数组举个例子

const constant = "buibuibuibui";
constant = "tututu";    //报错  因为使用const声明的常量不可更改。

但是,有一个奇怪的现象,使用const声明的数组和对象确可以更改其中的内容。

例如

const arr = [1,2];

arr.push(3);  //不会报错

console.log(arr);  // 打印[1,2,3]

在上面例子中,使用const声明的数组内容被改变但是却没有报错。

原因是:const本身是通过检测栈内存中的数据来控制常量不可变的,但是像数组和对象这种复杂数据类型,真实的数据是存储在堆内存中的,栈内存中存储的只是堆内存中的一个数据地址而已。

暂时还不了解什么是栈内存和堆内存的同学可以查看我的另一篇文章《javascript中的栈内存和堆内存,值类型和引用类型》

如图

zhan.png

为什么push()不报错,但是 arr = []却报错了

const arr = [1,2]

arr.push(3); //通过push方法去改变数组内容是不会报错的。

//但是

arr= [1,2,3]; //通过这种方式去改变数组内容,却是会报错的。

以上两种方法都是改变数组内容,为什么一个会报错一个却不会呢?

arr.push()的方式:是往堆内存中加入一项数据,而存储在栈内存中的堆内存地址确实不改变的。而const检测的是栈内存地址是否被改变。所以他不会报错。

arr = []:这种方式为什么会报错呢?我们解读一下。这个语句的意思是。创建一个新的空数组并将它赋值给左边的arr变量。注意:创建新的数组,意思是在堆内存中创建一个新的存储空间,这个新的堆存储空间会有一个新的地址。而将这个全新的数组赋值给左边的arr变量,arr原先存储的栈地址就会被替换。所以报错。

欢迎技术沟通,摸鱼聊天~

备注来自掘金~

wx:XXF1096032096