1. var:

    在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量(node:global),也是顶层对象(浏览器:window)。

    • 使用var声明的对象存在变量提升

      console.log(a)   //undefined
      var a = 10
      //编译阶段如下
      var a
      console.log(a)
      a = 10
      
    • var可以对变量进行多次声明,后面声明的变量会覆盖前面的变量声明

      var a = 10
      var a = 20
      console.log(20)   //20
      
    • 在函数中使用var声明的变量是局部的

      var a = 10
      function change(){
      	var a = 20
      }
      change()
      console.log(a)   //10
      
    • 在函数中不声明的变量是全局的

      var a = 10
      function change(){
      	a = 20
      }
      change()
      console.log(a)   //20
      
  2. let :

    ES6新增,用来声明变量

    • 用法类似于var,但是所声明的变量是局部变量

      {
      	let a = 20
      }
      console.log(a)   //ReferenceError: a is not defined
      
    • 不存在变量提升,或者说有变量提升,只是提升到了暂时性死区,只有声明赋值后才能使用

      console.log(a)   //Uncaught ReferenceError: Cannot access 'a' before initialization
      let a
      console.log(a)   //undefined
      a = 10
      console.log(a)   //10
      
    • let不能在相同作用域中重复声明

      let a = 10
      let a = 20    //Uncaught SyntaxError: Identifier 'a' has already been declared
      
  3. const:

    const声明一个常量(只读),一旦声明,常量的值就不能被修改

    const a = 1
    a = 3   //TypeError: Assignment to constant variable.
    

    const一旦声明就必须立即初始化,不能和varlet一样先声明后赋值

    const a   //SyntaxError: Missing initializer in const declaration
    

    如果变量被声明过,再使用const声明会报错

    var a = 10
    let b = 10
    const a = 20   //报错
    const b = 20   //报错
    

    const实际保证的并不是变量的值不可改动,而是变量指向的那个内存地址所保存的数据不可改动。对于简单类型的数据(基本类型),值就保存在变量指向的内存地址。对于复杂类型的数据(引用类型),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证指针不变,但不能保证变量结构不变。

    const foo = {}
    //添加数据,成功
    foo.a = 1;
    foo.a   //1
    
    //将foo指向另一个对象,报错
    foo = {}
    

    其它情况,和let一致

  4. 区别总结:

    • 变量提升:

      var声明的变量存在变量提升,在声明前调用值为undefined

      letconst没有生命提升,或者说提升到暂时性死区,在声明前使用会报错。

    • 暂时性时区:

      var不存在暂时性死区。

      letconst存在暂时性死区,只有等到声明变量,才可以获取和使用该变量

      //var
      console.log(a)   //undefined
      var a = 10
      
      //let
      console.log(b)   //Cannot access 'b' before initialization
      let b = 10
      
      //const
      console.log(c)   //Cannot access 'b' before initialization
      const c = 10
      
    • 块级作用域:

      var不存在块级作用域。

      letconst存在块级作用域。

    • 重复声明:

      var允许重复声明。

      letconst不允许重复声明

    • 修改变量的值

      varlet可以修改变量的值。

      const声明的是一个只读的常量,一旦声明不可修改。

  5. 使用:

    能用const尽量使用const,大多数情况使用let,避免使用var,防止全局变量污染。

参考文献:
https://vue3js.cn/interview/es6/var_let_const.html
https://es6.ruanyifeng.com/

posted on 2022-07-23 16:21  转眼春夏秋冬如烟  阅读(47)  评论(0)    收藏  举报