let 、const、var的区别

192 阅读2分钟

哈士奇最近了解到es6中更新的let和const两种命名变量的方式,那么为何es6会更新这两种方式呢?它解决了什么问题?它们与var的区别究竟在哪里呢?

let 、const、var的区别

预解析

预解析(变量预解析即变量提升),var所声明的变量是可以进行变量提升的,而let和const则无法达到同样的效果。

console.log(a)
console.log(b)
console.log(c)

var a=1
let b=2
const c=3

image.png

这里很明显,在预编译的时候,var声明的a被赋为undefined,然后从b开始便报错。

变量名称重复性

在新的es6中,var声明的变量是可重复的,但是let与const则会报错

var a=1
var a=1
let b=2
let b=2
const c=3
const c=3
console.log(a)
console.log(b)
console.log(c)

image.png

image.png

vscode已经写明错误,同时在写的过程中已经出现了提示了

变量作用域

var声明变量既可以作为全局作用域也可以作为局部作用域,而const和let声明的变量只能作为局部作用域(块级作用域)

function fn1() {
    var a = 0;
    let b = 0;
    const c=0;
    {
      var a = 1; 
      let b = 1; 
      const c=1;
    }
    function fn() {
        console.log('a:', a)
        console.log('b:', b)
        console.log('c:', c) 
    }
    fn()
  }
  fn1()

image.png

在这个例子中可以看出来let 和 const声明的作用域都受到块作用域的影响,而var则不受影响,只要同名变量赋值以后就会覆盖之前的变量值

初始值

对于var和let声明的变量来说可以不设置初始值,但是const声明的变量必须设置初始值

var a
let b
const c

image.png

image.png 很明显对c进行报错

相信大家从前面已经能够看出来var和let,const的区别了,那么根据这些特性,我们再聊聊es6出现解决了es5的问题

ES6中的这两个声明变量的方式解决了什么问题?

内层变量可能覆盖外层变量

用来计数的循环变量泄露为全局变量

从变量名称作用域我们可以看出来,对于var所声明变量来说,只要对相同名称的变量进行赋值时,就会覆盖原有变量的值,而使用let和const则不会存在这方面问题

下面是哈士奇给大家整理出来的相关的对比和汇总,大家可以参考一下 image.png