一、let
特点:
- 在块级作用域有效
- 防止内层变量影响外层变量
- 只能在大括号内有效
- 在括号内才有块级作用域
- 防止循环变量变全局变量
for (let a =0; a>=20; a++) {
}
console.log(a); // 报错
- 不存在变量提升,不能重复声明
console.log(a);
let a = 0; // 报错
- 暂时性死区
var num = 1;
if(true) {
// 这是一个花括号,let声明的变量就会绑定到这个块级作用域里,不会依次向上找
console.log(num); // num is not defined
let num = 3; // 不能变量提升
}
二、const
作用:声明常量,常量就是值(内存地址),不能变化的量。
特点:
- 块级作用域
- 声明常量必须赋初始值
- 常量赋值后,值不能修改,但是复杂的数据类型可以修改,但不可以赋值
例子:
const a = 99;
a = 10; // a 不能修改
/--- 内部的值可以修改,但不可以赋值
const arr = [1,52,12,36,4];
arr[0] = 85; // 如果输出,结果为[85,52,12,36,4]
arr = [12,5,3,2,0] // 如果输出,则报错
三、var
特点:
- 函数作用域
- 可以变量提升(即可以预解析)
- 值可以更改
var | const | let |
---|---|---|
函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可更改 | 值可更改 | 值不可更改(复杂的数据类型,如数组、对象可以被修改) |
注意:
- 当使用的值不需要函数的定义,数学公式中(如PI)恒定不变的数值,就是用const,这样效率会变高。
- let 和 var 最大的区别就是,let 不能变量提升,这也大大显示出来了let的优点。