1. ES6
-
var
:在ES6出来之前,声明变量都只能使用var
关键字 -
let
和const
都是ES6出来的新语法
2. 变量提升
- var会进行变量提升
而console.log(a) //undefined var a = 1
let
和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() // undefined
undefined
,变量a
会提升到if的上面去 -
const
和let
都是块级局部变量。
打印出来是{ let a } console.log(a) //undefined
undefined
。
打印出来也是{ const a =1 } console.log(a) //undefined
undefined
。
4. 申明赋值
-
var
和let
都不需要在申明的同时赋值var a console.log(a) //undefined
打印出来的都是let b console.log(b) //undefined
undefined
-
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 variable
TypeError: Assignment to constant variable.
6. 同名变量
-
var
可以声明同名变量
声明并赋值成功,打印出来的是2。var a = 1 var a = 2 console.log(a) //2
-
let
和const
在作用域内不能声明同名变量
报错:const a = 1 const a = 2
SyntaxError: Identifier 'a' has already been declared