JS中var、let和const的区别

826 阅读3分钟

✈var

🚗几个小小的实例

var a=10;
var a=20;
console.log(a)//结果为 20  说明可以重复声明而且值也改变
console.log(a)//结果为 underfind,说明用var声明的变量,有声明提升。使用可以在声明前。
var a=50;
 var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);//结果为10
      }
    }
    a[5]();

小结:从上我们可以发现var声明的变量是一个全局变量有它的长处也有它的不足,所以 Es6新增了一个命令let,也是用于声明变量的

✈let

🚗几个小小的实例

/*例子:1*/
    let a = 10;
    let a = 20;//结果:报错,Identifier 'a' has already been declared(标识符a已经被声明了)
    console.log(a);
    //说明不可以重复声明同一名称的变量
    console.log(a);// 结果:报错,Cannot access 'a' before initialization(不能在初始化之前使用a)
    let a = 10;
    //说明let声明的变量不存在声明提升
第一行   let a = 10;
第二行    if (true) {
第三行      console.log(a);//报错,在初始化之前无法访问'a',我们明明定义了a为什么报错呢?
第四行      let a = 30; // 块级作用域
第五行    }
第六行    console.log(a);//10

在最后一个小例子中我们发现,我们已经定义了a,为什么在后边打印a还会报错呢?这就得提一下两个概念暂时性死区块级作用域

🚑暂时性死区和块级作用域(解释如有不妥还请大佬们指正)

块级作用域:let声明了某个变量后,如果遇到{}就会形成一个作用域,我们把这个{}内的区域叫做块级作用域,如上我们在第一行声明了let a=10在第二行至第五行有一个块级作用域,所以运行到这里,外部的a是无法进去的,我们内部也不能调出这个块及作用域向上查找,所以我们想要在这个块级作用域内使用a则就会报错。

  • 为什么需要块级作用域?

    第一种情况:内层变量可能会覆盖外层变量

    第二种情况:循环中的计数器变量变成了全局变量。

暂时性死区: 在块级作用域内只要用let声明了变量,这个变量就和此作用域绑定了,并且仅在此区域内可使用。

✈var和let对比

  1. let不存在声明提升,如果在声明前调用,会报错;var可以在声明前调用,值为undefined。
  2. let不允许重复声明(如上例子1所示),var可以重复声明。
  3. let在使用时要注意暂时性死区和块级作用域问题

✈const

const的用法和let一样。

相同点:

  • 不存在声明提升
  • 暂时性死区
  • 块级作用域
  • 不允许重复声明。 不同点:
  • const用于声明常量;const声明的变量,必须赋值,而且值不能改变
 let a;
    a = 10;
    const b; //Missing initializer in const declaration  const声明的变量没有初始化。说明不存爱声明提前
    const b = 20;
    b = 30;
    console.log(b);//报错!说明不可以更改const声明的变量值
    const arr = [10,20,30];
    arr.push(40);
    console.log(arr);
    //为什么这里我们声明了arr数组,我们却可以改变数组的元素呢?Q1

✔总结

  • FQ1:const定义的变量存储的值如果是复杂数据类型,只要地址不变,就不算修改。
  • 一般情况下我们使用letvar就可以了,const常用于获取元素节点,引入模块化等。