const声明只读常量,使用时必须初始化,只能在块作用域里访问,一旦声明常量的值就不能改变。 📢 const实际上保证的并不是变量的值不得改动,而是变量指向的内存地址所保存的数据不得改动:对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量;对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变。 📢 用var或let声明过变量,再用const声明同样会报错!!! 📢 let /const/function会把当前所在的大括号(除函数之外)作为一个全新的块级上下文,应用这个机制,在开发项目的时候,遇到循环事件绑定等类似的需求,无需再自己构建闭包来存储,只要基于let的块作用特征即可解决
对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量
2. 重复声明
var允许在相同作用域内重复声明变量,后面声明的变量会覆盖前面的
let和const在同一作用域不允许重复声明变量
3. 变量提升
var声明的变量存在「变量提升」情况:变量可以在声明之前调用,值为undefined
console.log(a) //undefined
var a = 10
//在编译阶段,编译器会将其变成以下执行:
var a;
console.log(a);
a = 10;
4. 暂时性死区
let、const 声明的变量存在「暂时性死区」:变量在声明前都不可用
var a = 10;
if(true){a = 'abc'; // ReferenceErrorlet a;
}// let
console.log(b) // Cannot access 'b' before initialization
let b = 10// const
console.log(c) // Cannot access 'c' before initialization
const c = 10