es6中增加了let关键字以定义块级作用域的变量
1.var可以重复声明,后面的会覆盖前面的,let不允许重复声明,会直接报错
var a = 10;
var a = 20;//20
console.log(a);
let b = 10;
let b = 20;//Identifier 'b' has already been declared
console.log(b);
2.var存在变量提升,let不存在变量提升
console.log(a);//undefined
var a = 10;
console.log(b);
let b = 20;//b is not defined
3.let声明的变量支持块级作用域,var声明的变量不支持块级作用域
for (var j = 0; j < 4; j++){
console.log(j);
}
console.log('j is ' + j);//j is 4
for (let i = 0; i < 4; i++){
console.log(i);
}
console.log(i);//i is not defined
用let声明的关键字只在let关键字所在的代码块内有效,外部拿不到
4.var声明的变量会绑定到window对象上,let不会
var a = 10;
var sum = 100;
console.log(window.a);//10
console.log(window.sum);//100
let b = 20;
const num = 666;
console.log(window.b);//undefined
console.log(window.num);//undefined
const用于声明变量,const声明的值不可改变,且在声明的同时必须初始化,不初始化会报错
const a = 100;
const b;//声明的时候不初始化会直接报错
b = 200;//报错
console.log(a);//100
// console.log(b);
总结
1.var定义的变量会绑定到window上,let和const不会
2.var可以重复声明变量,let和const若重复声明会直接报错
3.const声明的同时必须初始化,不初始化直接报错
4.let没有变量提升
5.let支持块级作用域
6.const声明的变量不可以被修改,但是变量里面的属性可以被修改,若想连属性也不能被修改,需要用Object.freeze(obj);冻结变量