如何理解,js中使用const声明的变量不可以修改?

js中声明变量的方式

  • 众所周知,在JavaScript中,声明变量一般有三种方式:varletconst

出现疑问

  • 也许你看过或者听过类似的这一句话:
    • 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中是如何保存数据(基础类型、引用类型),也可以看看我之前的总结,仅供参考哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值