let,const 和var的区别
由于ES6的出现,变量声明不再单调,除了可以用var外,还可以使用let和const。这下来看看它们之间的区别。
-
变量提升问题
console.log(a); //undefined var a = 1 console.log(b);// Cannot access 'b' before initialization let b = 1 console.log(c); const c = 1 //Cannot access 'c' before initialization
- 通过以上代码可以看出var声明的变量a,有变量提升,报错显示a
声明了但是没有赋值,默认undefined
- 通过let和const分别声明的变量b和c,报错显示
无法在初始化之前访问
- 通过以上代码可以看出var声明的变量a,有变量提升,报错显示a
-
作用域问题
- 由于es5没有块级作用域的概念,所以var肯定也没有作用域的影响,但是let和const只在当前作用域起作用
{ var a = 1; let b = 2; const c = 3 } console.log(a);//1 console.log(b);//Cannot access 'b' before initialization console.log(c);//Cannot access 'c' before initialization
- 看上面代码中,使用let和const声明的变量报错,var声明的返回正确的值,这说明,let声明的变量只在它所在的代码块有效。
-
能否重复声明
- 同一作用域下var可以重复声明变量,但是let和const不可以,看下面代码
//同一作用域不可以重复声明 var a = 1 console.log(a);//1 var a = 2 console.log(a);//2 let b = 3 let b = 4//Uncaught SyntaxError: Identifier 'b' has already been declared //不同作用域可以 { let a = 1 console.log(a);//1 } let a = 2 console.log(a);//2
- 同一作用域之下用let再次声明变量b报错,
变量b已经声明
,但是不同作用域下就可以重复声明
-
const声明的注意事项
- 首先const在声明变量的同时必须赋值
- const声明的是一个常量,声明之后不可以修改
const a//Uncaught SyntaxError: Missing initializer in const declaration const a = 1 console.log(a);//1 a = 2//Uncaught TypeError: Assignment to constant variable.
- 看上面代码声明a的时候没有赋值,报错
声明变量的时候没有初始化
- 声明a并赋值为1之后,再赋值a为2时,报错
给一个常量赋值了