1.let和const

199 阅读2分钟

1.let和const声明的变量没有变量声明提升

使用var声明变量:

console.log(a);//undefined
var a = 2;

使用var在声明变量之前对变量进行调用并没有报错,仅输出undefined,这是因为使用var声明变量时存在变量声明提升。以上代码相当于:

var a;
console.log(a);
a = 2;

使用letconst声明变量:

//使用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;

都会直接报错,所以,使用letconst声明的变量没有变量声明提升。

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对变量进行重复声明时,后声明的会将先声明的变量值进行覆盖,而如果使用letconst对变量进行重复声明的话则会直接报错。

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