let 的特点
- 块级作用域
{
let i = 1;
}
console.log(i); // ReferenceError: i is not defined
let 在循环中定义变量时,只在本轮循环有效,每一次循环都是一个新的变量,而 var 在循环中定义变量时,变量的作用域是整个循环,所以会覆盖前面的变量。
let 在循环中定义变量时,JavaScript 引擎会记住上一轮循环的值,初始化本轮的变量时,会在上一轮循环的基础上进行计算。
ES6 的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。
if(true) let i = 1; // SyntaxError: Lexical declaration cannot appear in a single-statement context
- 不允许重复声明
var i = 1;
let i = 2; // SyntaxError: Identifier 'i' has already been declared
- 没有变量提升
console.log(i); // ReferenceError: Cannot access 'i' before initialization
let i = 1;
- 暂时性死区
let i = 1;
{
console.log(i); // ReferenceError: Cannot access 'i' before initialization
let i = 2;
}
因为暂时性死区的存在,typeof 操作也不再安全。
typeof i; // ReferenceError: Cannot access 'i' before initialization
let i = 1;
- 不存在于顶层对象
let i = 1;
console.log(window.i); // undefined
var 和 function 声明的全局变量,依旧是顶层对象的属性。
let 、const 、class 声明的全局变量,不属于顶层对象的属性。
const 的特点
- const 不能重复声明,也不能修改。
const i = 1;
i = 2; // TypeError: Assignment to constant variable.
const 一旦声明变量,就必须立即初始化,不能留到以后赋值。
- const 其他特点和 let 基本一样。