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);

来看一下结果

image-20200802190723555

可以看到值已经发生了改变


前端小白