let、const 和 var的区别
1、const定义的是常量,定义以后无法修改
const n = 1;
n = 2;
console.log(n);
//=> 报错 Assignment to constant variable
2、var有变量提升,let 和 const没有变量提升
console.log(n);
var n = 1;
//=>undefined
console.log(n);
let n = 1;
//=> 报错 n is not defined
3、let 和 const 在大括号中(除对象和函数的大括号,如for循环的大括号),会形成块级作用域,而 var 不会
{
var a = 1;
}
console.log(a);
//=> 1
{
let a = 1;
}
console.log(a);
//=>报错 a is not defined
ES6 里面是有块级作用域的概念的,在块级作用域外面是获取不到里面的变量的,除对象和函数的大括号,如for循环的大括号就会形成块级作用域。
4、有let声明过的变量,则不能重复声明,词法解析阶段就会报错
console.log("ok");
let a = 3;
var a = 5;
//=> 报错 Identifier 'a' has already been declared
let声明的变量不能重复声明,在ES6的语法中,虽然没有变量提升,但是有一个词法解析阶段,在代码还没有执行的时候,如果检测出来有重复声明的变量,就直接报错,上面的ok并不会打印出来
5、let、const有暂时性死区
var tmp = 123;
if(true){
tmp = "abc";
let tmp;
}
//=> 报错 ReferenceError: tmp is not defined
console.log(type a);
//=> undefined
console.log(a);
//=> 报错 a is not defined
ES6中有"暂时性死区"的概念,在变量声明之前,不能使用此变量,使用的话就会报错,直到遇到那行声明变量的代码了,才可以,而且还解决了之前 "用 typeof 检测未声明的变量" 不报错的问题。
6、var 在全局声明的变量会给 window 增加一个对应的属性,且二者会形成映射关系,一个改变另一个也跟着变,而let 和 const 则不会。
var n =1 ;
console.log(window.n);
n = 2;
console.log(window.n);
console.log(n);
window.n = 3;
console.log(window.n);
console.log(n);
//=> 1 2 2 3 3
let n =1 ;
console.log(window.n);
n = 2;
console.log(window.n);
console.log(n);
window.n = 3;
console.log(window.n);
console.log(n);
//=> undefined undefined 2 3 2