const
特点:
- const不允许在同一作用域重复声明,块级作用域
- 暂时性死区,在声明之前,该变量是不可用的
- const声明的是一个只读变量,声明之后不能改变其值,一旦声明必须初始化
- 但是const定义的对象属性是可以修改的
块作用域由{}包括,if语句和for语句里面的{}也输入块作用域
对象是引用类型的,const定义的对象是保存指向对象的指针,这里的“不变”是指对象的指针不变,而修改对象中的属性不会使对对象的指针发生变化。
const a=3{const a=1console.log(a)//1}{//a是对象,可以修改对象的属性const a={name: 1}console.log(a)//{ name: '1' }a.name=2console.log(a)//{ name: '2' }}console.log(a);//3
var
- 变量提升,声明的变了会自动提升到他所在作用域的顶部
function fun() {console.log(variable); var variable = "hello";
}
fun(); // 结果是 undefined
因为上面的代码等同于:
function fun() {var variable;console.log(variable); variable = "hello";
}
fun(); // 结果是 undefined
- var可以重复声明同一个变量
- 在使用 var 的时候,最常见的问题就是对迭代变量的奇特声明和修改
for (var i = 0; i < 5; ++i) { setTimeout(() => console.log(i), 0)
}
// 你可能以为会输出 0、1、2、3、4
// 实际上会输出 5、5、5、5、5
let
- 块级作用域
- 不允许在同一个块作用域中重复声明变量
- 暂时性死区
let和var的区别:
for (var i = 0; i < 5; ++i) { // 循环逻辑
}
console.log(i); // 5for (let j = 0; j < 5; ++j) { // 循环逻辑
}
console.log(j); // ReferenceError: j 没有定义
声明风格
尽量不使用var
const优先,let次之
使用const声明可以让浏览器运行时强制保持变量不变,也可以让静态代码提前发现不合格的声明。