let、const和var
作用域
var作用于全局,先来看一个例子
for (var i = 0; i < 5; i++) {
var a = 1;
}
console.log(a, i);
// 1 5
跳出了for循环之外a依旧可以访问,用于控制循环的i也能够访问,i=5循环跳出,所以i是5
再来看一下把var改成const
for (var i = 0; i < 5; i++) {
const a = 1;
}
console.log(a, i);
// Uncaught ReferenceError: a is not defined
这时a是块级作用域,除了循环之后就访问不到了,再来看i,把i改成const声明
Uncaught TypeError: Assignment to constant variable.
const属于常量,赋值之后不能改变,这里应该用let,let是变量
重复声明
var b = 1;
var b = 2;
console.log(b);
// 2
用var可以重复声明,再来试一下const
const b = 1;
const b = 2;
console.log(b);
// Uncaught SyntaxError: Identifier 'b' has already been declared
可以看出const不可以重复声明,再来试一下let
let b = 1;
let b = 2;
console.log(b);
// Uncaught SyntaxError: Identifier 'b' has already been declared
由此可以看出,const和let不可以重复声明
总结
cosnt和let是ES6新出的块级作用域,不可以重复声明,此外
const b;
b = 2;
console.log(b);
// Uncaught SyntaxError: Missing initializer in const declaration
const不可以先声明后赋值,let可以
上面说到const不可以重新赋值,有一种情况例外
const b = {
a: 'a'
};
b.a = 'b';
console.log(b);
来看一下结果
可以看到值已经发生了改变