zoukankan      html  css  js  c++  java
  • 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一样

  • 相关阅读:
    AJAX问题总结(针对JAVA)
    关于IE浏览器的缓存问题
    tomcat和jdk版本兼容问题。
    Java中的索引和数据库的索引区别
    Eclipse 连接Oracle 11g 时报ORA-12505错误的解决办法
    Tomcat 8 & JNDI Datasource
    【LeetCode】019. Remove Nth Node From End of List
    【前端UI框架】EasyUI
    装饰者模式
    【LeetCode】234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/yznotes/p/12442994.html
Copyright © 2011-2022 走看看