ES6中新增的两种声明变量的方法 let关键字和const 关键字,下面我们来逐一了解。
目录
一、使用let 关键字声明变量特点
1、具有块级作用域
if (true) {
//因为这个 num 使用 let 关键字定义的,所以只能在这个 if 的 {} 内使用
let num = 100
console.log(num);
}
console.log(num); //结果为第一个100 第二个报错
上述代码中,变量a只能在大括号中使用, 块级作用域的好处是在业务逻辑比较复杂的时候,能够防止内部变量覆盖外层变量。var 关键字是不具备块级作用域这个特点的。下面来看一下var 声明变量的例子。
if(true) {
var abc = 100
}
console.log(abc); //打印结果为100
由结果可以看到块级作用域对 var 关键字并没有产生影响。
2、不存在变量提升
console.log(a);
let a = 100; //打印结果出错
正确的写法应该是先声明再使用
let a = 100;
console.log(a); //打印结果 100
3、具有暂时性死区
var tmp = 123;
if(true) {
console.log(tmp); //undefined
let tmp = 456 ;
}
打印结果会显示未定义,这是为什么那?正是因为let 不存在变量提升,所以if 语句内部打印 tmp 结果是没有定义的,又因为一旦在块级作用域内声明变量,变量就会和块级作用域进行绑定,在块级区域内的变量和外部声明的变量是没有关系的,所以最终的结果就是 undefined.
二、 使用 const 关键字声明常量特点
const作用:声明常量,常量就是值(内存地址)不能变化的量
1、具有块级作用域
if(true){
const a = 10;
}
console.log(a) //a is not defined
如以上代码显示,在if 语句中声明常量,外部是找不到的。
2、声明常量时必须赋初始值
const A; //Missing initializer in const declaration
上述代码报错就表示了const 声明常量时必须赋初始值,正确的声明方法如下:
const A = 111;
console.log(A); //打印结果为 111
3、常量赋值后,值不能修改
分为两种情况:对于基本数据类型和复杂数据类型情况是不一样的。先看基本数据类型的一个例子。
const A = 111;
A = 222; // Assignment to constant variable.
通过上面代码报错得知,一旦使用const 进行常量赋值后,是不可以改变的。
const arr = [100,200];
arr[0] = "a";
arr[1] = "b";
console.log(arr); //["a","b"]
arr = ["a","b"]; //Assignment to constant variable.
首先利用 const 声明了一个 arr 数组,然后利用下标值更改对应的值是可以更改成功的,因为这个 操作并没有更改 arr 常量在内存中的存储地址。接下来的代码是给arr 常量重新赋值,赋的值为新数组,打印的结果就是不被允许的,因为这个操作改变了 arr 常量在内存中的存储地址。所以:对于复杂数据类型来说,内部的值是可以更改的,但是不可以重新赋值。
三、let、const、var 的区别
1、使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
2、使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
3、使用 const 声明的常量,在后面出现的代码中不能在修改该常量的值。
var | let | const |
函数作用域 | 块级作用域 | 块级作用域 |
变量提升 | 不存在变量提升 | 不存在变量提升 |
值可以更改 | 值可以更改 | 值不可以更改 |