js中声明变量的方式
- 众所周知,在
JavaScript
中,声明变量一般有三种方式:var
、let
、const
出现疑问
- 也许你看过或者听过类似的这一句话:
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
- 但是后来在实际开发中,经常使用
const
声明一个对象,如下:
// 使用const申明一个变量
const state = {
name: '张三',
age: 18,
}
state.name = '李四' // 不会报错
- 不是说使用
const
声明的变量不可以修改吗?那上面的代码修改怎么解释?
发现答案
- 今天在阅读
js红宝书
《JavaScript高级程序设计第4版》时,发现在第29页,有这样一段话const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象, 那么修改这个对象内部的属性并不违反 const 的限制。
- 这似乎解释了我还刚才的疑问,于是又看了阮一峰的《ES6教程》,也写到类似的解释:
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
总结
-
js中使用const声明的变量不可以修改?
- 不可以修改的
值
指的具体是什么? - 答:实际这个值是保存变量的空间地址
- 不可以修改的
-
因此,使用
const
声明的变量不允许修改的实际是那个地址空间,举个例子:
/* 例子1 */
const foo = {}; // 声明一个变量,会开辟一个空间 00xx11
foo.prop = 123; // 为 foo 添加一个属性,可以成功
foo.prop // 123
// 将 foo 指向另一个对象,就会报错 TypeError: "foo" is read-only
foo = {}; // 相当于 将一个新的地址空间(00xx12) 赋值给了 foo
/* 例子2 */
const a = []; // 开辟了一个空间 00xx33
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['Dave']; // 报错 相当于将一个新的空间地址 00xx55 赋值给a
-
大致是这么一个情况,总而言之,使用
const
声明的变量,是不允许重新赋值- 对于基础数据类型,展示的效果确实是不允许修改值
- 但对于赋值数据类型,其实是可以修改数组或对象的值,只不过是不允许修改其空间地址
-
如果还不太了解,可以去百度
js中数据存储的方式
,去了解下:在js中是如何保存数据(基础类型、引用类型),也可以看看我之前的总结,仅供参考哦!