js 中的const

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指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

你可能感兴趣的:(js 中的const)