1. ES6
-
var:在ES6出来之前,声明变量都只能使用var关键字 -
let和const都是ES6出来的新语法
2. 变量提升
- var会进行变量提升
而console.log(a) //undefined var a = 1let和const这么打印的时候,会报错。 -
let和const不能变量提升
报错: b is not definedconsole.log(b) //报错: b is not defined let b = 2
报错: c is not definedconsole.log(c) //报错: c is not defined let c = 3
3. 作用域
-
var是全局变量。
这段代码打印出来的事function fn(){ if(true){ console.log(a) }else{ var a = 1 console.log(2) } } fn() // undefinedundefined,变量a会提升到if的上面去 -
const和let都是块级局部变量。
打印出来是{ let a } console.log(a) //undefinedundefined。
打印出来也是{ const a =1 } console.log(a) //undefinedundefined。
4. 申明赋值
-
var和let都不需要在申明的同时赋值var a console.log(a) //undefined
打印出来的都是let b console.log(b) //undefinedundefined -
const必须在声明的同时赋值,不然就会报错
编译器就会报错:const a
控制台报错:
SyntaxError: Missing initializer in const declaration
5. 赋值更改
-
var和let都可以在作用域内改变声明的变量的值
打印出来的是2。var a = 1 a = 2 console.log(a) //2
打印出来的是2。let b = 1 b = 2 console.log(b) //2 -
const声明的变量在作用域内,基本数据类型赋值不能更改。如果是复杂类型,就可以修改。
编译器报错:const c = 1 c = 2
控制台报错:Attempt to assign to const or only variableTypeError: Assignment to constant variable.
6. 同名变量
-
var可以声明同名变量
声明并赋值成功,打印出来的是2。var a = 1 var a = 2 console.log(a) //2 -
let和const在作用域内不能声明同名变量
报错:const a = 1 const a = 2SyntaxError: Identifier 'a' has already been declared
