const 声明一个只读的常量,一旦声明,就无法修改它的值
一 const 与 let 的共同点
一样存在 一样的块级作用域 暂时性死区 不可重复声明。
// 块级作用域
if (true) {
const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined
// 不存在变量提升
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
// 不可重复声明
var message = "Hello!";
let age = 25;
const message = "Goodbye!"; // 报错
const age = 30;// 报错
二 const 本质
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。可以修改复合数据类型的的属性。
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。