let

  • 声明一个块级本地变量,可同时将其初始化为一个值。
  • 特点:

    • 具有块级作用域
    • 必须是定义之后才能使用
    • “不存在声明提升”
    • 不允许重复定义
    • 具有暂时性死区(TDZ)

      1. 定义的变量只能在定义所在的代码块中使用

      (for循环稍微特殊)
      1. let i=10;
      2. {
      3. let b = 2;
      4. console.log(b);
      5. console.log(i);
      6. }
      7. console.log(b);
      8. //for
      9. let i=10;//外层作用域仍可定义同名的变量
      10. for(let i=1;i<10;i++){
      11. console.log(i);//块级作用域
      12. }
      13. console.log(i);//10

      2. 必须是在定义之后才能使用,否则报错

      1. console.log(i);let i =1;// 创建 定义(初始化) 赋值

      3. “不存在声明提升”

      实际上let定义的变量会在JavaScript预编译阶段将变量的创建过程提升了的,只不过初始化过程没有像var一样提前,就导致了在定义之前访问let定义的变量会报错:不能在初始化之前访问变量。let变量的初始化过程和赋值过程是赋值语句执行时完成的。
      1. var i;
      2. console.log(i);//undefined
      3. i =1;
      4. console.log(a);
      5. console.log(i);
      6. let i =1;//定义(初始)

      4. 不允许重复定义(同一作用域下)

      1. let i =1;
      2. console.log(i);//不会输出,直接报错,重复定义
      3. i = 2;
      4. console.log(i);
  • 页面上没哟任何输出而是直接报重复定义的错误,说明是有声明提升的

    5. 暂时性死区(TDZ)

    指的是在let赋值之前的区域是无法使用该变量,包括全局的同名变量,不能使用该变量的那部分区域就称tdz

    1. let i =2;
    2. {
    3. /*TDZ
    4. console.log(i);
    5. */
    6. let i =1;
    7. }

    const

  • 概念:const是ES6新增用于定义变量的关键字。效果类似于let。具有和let大多数一样的特点,有细节的区别

  • 特点:

    • 声明一个只读的命名常量。
    • 常量是块级作用域,很像使用 let 语句定义的变量。
    • 常量的值不能通过重新赋值来改变,并且不能重新声明(针对基本类型的数据而言)
      • 针对基本类型的数据,是完全不可修改。
      • 如果是引用类型的数据,比如对象,数组等。只要操作的是赋值时的对象或数组,那么时可以对对象或数组进行处理。比如属性的添加或修改,或数组中数据的 添加或删除。但是不能将新的对象或数组赋给变量

        1. “不可修改”

  • 针对基本类型的数据,是完全不可修改。

  • 如果是引用类型的数据,比如对象,数组等。只要操作的是赋值时的对象或数组,那么时可以对对象或数组进行处理。比如属性的添加或修改,或数组中数据的 添加或删除。但是不能将新的对象或数组赋给变量

    1. // const i = undefined;
    2. // i = 2;//报错
    3. // console.log(i);
    4. const obj = {};
    5. obj.name = '张三';//对象中添加属性
    6. console.log(obj);//不会报错
    7. // obj = {};//报错
    8. const arr = [];
    9. arr.push(1,2,3);
    10. console.log(arr);//不会报错
    11. // arr = arr.filter();//报错
    12. arr =[];//报错

    var、let和const的区别和联系

  • 联系:都是用于定义变量。

  • var是用于全局作用域或函数作用域,而let和const是块级作用域。
  • var存在声明提升,而let和const”不存在声明提升”。var的声明提升包括了(创建和初始化),而let和const的声明提升只包含了创建过程。而初始化和赋值过程都是在定义语句执行。
  • let和const具有不可重复定义、不能在定义之前使用、存在TDZ,而var没有上述特点。
  • let和var变量的数据可以被修改。而const定义的变量”不可修改”