记录一些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 = 20

3、可以进行多次重复声明,后声明的变量覆盖前面声明的变量

var a = 20
var a = 30
console.log(a) //30

4、函数内部使用var声明变量是局部的,不用var是全局的

var a = 20
function changeA () {
    a = 30
}
changeA()
console.log(a)    //30
Let

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 = 20

3、不能重复声明(除非在不同得作用域)

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'