记录一些es6相比之前的变化
Var、Let、Const的区别
var
1、声明的是全局变量,也是顶层变量,在ES5中,顶层对象(在浏览器中=window对象,在node环境中=global对象)=全局变量
var a = 1;
console.log(window.a) //等价2、存在变量提升的问题
console.log(a) // undefined
var a = 20
=>
var a
console.log(a)
a = 203、可以进行多次重复声明,后声明的变量覆盖前面声明的变量
var a = 20
var a = 30
console.log(a) //304、函数内部使用var声明变量是局部的,不用var是全局的
var a = 20
function changeA () {
a = 30
}
changeA()
console.log(a) //30Let
1、ES6新增,声明变量,类似Var,但声明的变量只在let所在的代码块内生效
{
let a = 20
}
console.log(a) //a is not defined
var a = 123 //只要块级作用域内存在let声明的变量,这个变量就不再受外部的影响
if (true) {
a = "abc" //报错referenceError
let a
}2、不存在变量提升问题
console.log(a) //报错referenceError can't access 'a' before initailization
let a = 203、不能重复声明(除非在不同得作用域)
let a = 30
let a = 20 // Indentifier 'a' has already been declared
function (arg) {
let arg // Indentifier 'a' has already been declared
}
//以下可以通过
let a = 20
{
let b = 30
}Const
const 声明一个只读的、必须立即初始化的常量,且声明后不能改变其地址的值(复杂类型数据{},保存指针的结构不变,还是可以修改),若与let或var重复声明会报错
const a = 1
a = 3 //Assignment to constant variable
const a; //syntaxError:Missing initializer in const declaration
var a = 20
let b = 20
const a = 30 //报错
const b = 30 //报错
const foo = {}
foo.prop = "123" //不报错,且保存成功
foo = {} //TypeError:'foo is readonly'