1.let和const声明的变量没有变量声明提升
使用var声明变量:
console.log(a);//undefined
var a = 2;
使用var在声明变量之前对变量进行调用并没有报错,仅输出undefined,这是因为使用var声明变量时存在变量声明提升。以上代码相当于:
var a;
console.log(a);
a = 2;
使用let和const声明变量:
//使用let
console.log(a);//Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 10;
//使用const
console.log(a);//Uncaught ReferenceError: Cannot access 'a' before initialization
const a = 10;
都会直接报错,所以,使用let和const声明的变量没有变量声明提升。
2.let和const声明属于块级作用域
在作用域外不能对它们声明的变量进行调用
{
var a = 1;
let b = 2;
const c = 3;
}
console.log(a);//1
console.log(b);//b is not defined
console.log(c);//c is not defined
3.let和const不允许重复声明变量
使用var对变量进行重复声明时,后声明的会将先声明的变量值进行覆盖,而如果使用let或const对变量进行重复声明的话则会直接报错。
var a = 10;
var a = 5;
console.log(a);//5
let b = 1;
let b = 2;//Identifier 'b' has already been declared
4.const声明特点
const声明的是常量,在声明时就要对其进行赋值,且赋值后无法对值进行再次修改。
const a;//Missing initializer in const declaration
const a = 10;
a = 5;//Assignment to constant variable.
值得注意的是const声明对象,同样不能重复声明。同时可以修改对象中属性的值,但是不能修改对象的属性。
const person = {
name:'tom'
}
person.name = 'jerry';//不报错
person = {
age:'20'
}//Assignment to constant variable.
5.使用let和const的好处
1.for循环中用来计数的变量不会因声明提升而变成全局变量
const arr = [];
//使用let声明计数变量
for (let i = 0; i < 10; i++) {
arr[i] = function() {
return i;
}
}
console.log(arr[5]());//5
//--------------------
const arr = [];
//使用var声明计数变量
for (var i = 0; i < 10; i++) {
arr[i] = function() {
return i;
}
}
console.log(arr[5]());//10
2.不会污染全局变量
//使用let
let RegExp = 10;
console.log(RegExp);//10
console.log(window.RegExp);//ƒ RegExp() { [native code] }
//--------------------
//使用var
var RegExp = 10;
console.log(RegExp);//10
console.log(window.RegExp);//10
建议:在默认情况下用const,而只有在你知道变量值需要被修改的情况下使用let。