ES6中的let与const---let与var的区别---详解

let是ES6中新增的,是对变量的声明。与var用法类似,但是大有不同。

1. let不允许重复声明变量,var可以

1 var a = 1;
2 var a = 2;
3 console.log(a); //输出结果为 2
1 let b = 2;
2 let b = 3;
3 console.log(b);  //报错

但是,如果let声明了一个变量,变量的值可以改变。

1 let b = 2;
2 b = 3;//这里是赋值,不是声明
3 console.log(b);  //3   

2. let没有变量提升,也就是不会在预解析的时候进行解析。

1 console.log(a);//undefined
2 var a;
3         
4 console.log(b);
5 let b;   //报错

3. 声明的变量只在let命令所在的代码块内{}有效。

1 for(let i = 0; i < 3; i++){
2       i = i;
3 }
4 console.log(i); //ReferenceError: i is not defined
1 for (var i = 0; i < 3; i++) {
2        i = i;
3 }
4 console.log(i);//3
ES6中允许块作用域任意嵌套,外层无法访问内层的变量。但是内层可以访问外层,也就是子级访问父级;
1         {
2             let a = 1;
3             {
4                 console.log(a);  //1
5                 {
6                     console.log(a);  //1
7                 }
8             }
9         }
1         {
2             console.log(a); //ReferenceError: a is not defined
3             {
4                 let a = 1;
5             }
6         }
1         {
2             console.log(a); //undefined
3             {
4                 var a = 1;
5             }
6         }

注意:上面代码结果为undefined,是因为预解析,var a变量提升;

在下面for循环中,如果使用var,将返回5。

1 var arr = [];
2 for(var i = 0; i < 5; i++){
3     arr[i] = function(){
4         console.log(i);
5     }
6 }
7 arr[3](); // 输出5;

因为,var 声明的i是一个全局变量,i 的值随着每次循环发生改变,但是function里面的 i 都是指向同一个 i,那就是全局的变量 i,也就是说返回的是循环结束后最终的 i 的值5。

用白话来说的话就是,每次循环都给数组增添了一个值,随着循环的进行,已经加入到数组了,每个值都是一个函数,每个函数都是function(){console.log(i)};for循环在一瞬间就完成了,当去调用函数时,函数让输出i,i指向全局,此时循环结束 var i = 5;所以最终返回5。

如果将for循环的var声明改成let声明,那么将会返回3。

1 var arr = [];
2 for(let i = 0; i < 5; i++){
3     arr[i] = function(){
4         console.log(i);
5     }
6 }
7 arr[3](); // 输出3;

这是因为如果i用let来声明,那么当前的i只在本轮循环有效,每次的循环都是重新定义i。那么重新定义的话为什么i的值不一直是0?这是因为javascript引擎内部会记住上一次循环的值,再进行初始化时,是按照上一次循环的基础进行计算。

此外,在for循环中,设置循环变量那部分是一个父级作用域,而循环内部是一个单独子作用域。

1 for(let i = 0; i < 2; i++){
2     let i = 200;
3     console.log(i); 
4     //200
5     //200
6 }
for循环的内部是一个子作用域,let声明只在该代码块有效,所以外层let不受影响,循环2次。
硬性标准:代码块{}内,let声明的变量就绑定在这个区域,不再受外部的影响。
 
 
 
 
再来说说const
const也ES6新增的定义常量的关键字。注意:一旦声明,常量的值不能改变的!
1. 常量一定要赋值,否则报错
1 const a;
2 console.log(a); //SyntaxError: missing = in const declaration

2. 常量的值不能改变,改变会报错

1 const a = 10;
2 a = 99;
3 console.log(a); //TypeError: invalid assignment to const `a'

3. 常量不能重复声明,否则报错

1 const a = 10;
2 const a = 99;
3 console.log(a); //SyntaxError: redeclaration of const a

其他特点和let一样

猜你喜欢

转载自www.cnblogs.com/yznotes/p/12442994.html