JavaScript中const声明数组:可变性与重新赋值的概念疑问
搞懂JavaScript中const、数组可变性与重新赋值的区别
嘿,这个问题其实是JavaScript里const关键字最容易让人懵的点之一,我来给你理清楚~
首先得明确**const的核心规则**:用const声明的变量,它的引用(也就是指向的内存地址)是不可变的,但它指向的「值」如果是引用类型(比如数组、对象),这个值本身的内容是可以修改的。
咱们结合你的代码来看:
为什么修改数组元素没问题?
你写的:
const cars = ["Saab", "Volvo", "BMW"]; cars[0] = "Toyota"; cars[1] = "Honda"; cars[2] = "Hyundai";
这里cars变量一直指向的是最初创建的那个数组对象,你只是在修改这个数组内部的元素——就像你有一个抽屉,你只是把抽屉里的东西换掉,抽屉本身还是原来那个,所以const不会阻止这种操作。
为什么直接重新赋值整个数组会报错?
而当你写:
cars = ["Toyota" , "Honda" , "Hyundai"];
这时候你其实是在让cars变量指向一个全新的数组对象,相当于把原来的抽屉换成了另一个新抽屉——这就改变了cars变量的引用,而const的规则就是不允许修改变量的引用,所以浏览器会抛出错误。
怎么解决?
如果你确实需要给变量重新赋值整个数组,那应该用let来声明变量:
let cars = ["Saab", "Volvo", "BMW"]; cars = ["Toyota" , "Honda" , "Hyundai"]; // 这时候就完全没问题了
简单总结一下:
const锁的是「变量的引用」,不是「引用指向的内容」- 数组/对象的可变性是指它们内部的内容可以修改,和
const的规则不冲突 - 重新赋值变量指向新对象,只有
let/var允许,const不行
内容的提问来源于stack exchange,提问作者Tanmay Lodha
相关产品推荐
相关产品推荐

