var、let、const区别

353 阅读5分钟

几天给大家总结了一下var、let、const的区别以及优缺点,也给初入前端大家庭的朋友详细讲解的关于变量之间的区别,如果有问题的还请各位指点,

var

在ES5中,顶层对象的属性和全局变量的属性是等价的,用var声明的变量是全局变量也是顶层变量。
顶层对象在浏览器环境指的是window对象。

    var num = 10
    console.log(window.num); //控制台打印 10

使用var声明存在变量提升的情况。比如看下面一段代码

    console.log(num); //控制台打印 undefined
    var num = 10

但实际情况var并不是这样执行的,因为var存在变量提升,所以是声明了变量没有给值此时会打印undefined。如果上方等同的代码在let和const上执行不会出现以下的变量提升的只会报错。

    var num 
    console.log(num); //控制台打印 undefined
    num = 10

使用var我们可以对一个变量多次进行声明,后面声明的变量会覆盖前面声明的变量

    var num = 10
    var num = 20
    console.log(num); //控制台打印 20

若在函数内部使用var声明的话,它就是局部变量。

    var num = 20
    function Fn() {
      var num = 30
    }
    Fn()
    console.log(num) //控制台打印 20

若不在函数中使用var,那么他就是全局变量

    var num = 20
    function Fn() {
      num = 30
    }
    Fn()
    console.log(num) //控制台打印 30

let

ES6新语法,其实和var差不多的一个情况,在var上优化一部分功能使程序员用起来更加的方便。
它的用法和var很相似,但是又有很多不同,比如:
一、 所声明的变量,只在let命令所在的代码块内有效
比如在函数内声明就只能在函数内使用

二、 没有变量提升

console.log(num) // 报错
let num = 2

此时变量num还未声明就调用它,只会报错,没有变量提升
三、 不允许重复声明

let num = 20
let num = 30  //打印报错 Uncaught SyntaxError: Identifier 'num' has already been declared

不允许重复对一个变量在相同作用域重复声明,若需要修改只能按一下列所示代码执行

    let num = 10
    num = 20
    console.log(num); //控制台打印20

后面的num会覆盖前面的num,注意是相同作用域的情况下是不能重复声明的,但是在不同作用域就可以重复声明,互不影响。如下列代码

    let num = 25
    {
        let num = 40
    }

这种情况下是不会报错的。

const

const和let又是极其相似,const的最大特点就是,它是一个常量,一旦声明变量之后,就不允许修改它的值否则就会报错

    const num = 10
    num = 30

const一旦声明变量,就要立即初始化,不可往后再赋值,否则就会报错

const a; //声明要立即初始化 不然就会报错

如果一个变量,之前在var或let上被声明过,那么不能再用const重复声明,否则就会报错。

    var num = 100
    let Tnum = 100
    const num = 200
    const Tnum = 200
    // 都会报错

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动 对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量 对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变

    const obj = {};

    // 为 obj 添加一个属性,可以成功
    obj.prop = 123;
    obj.prop // 123

    // 将 foo 指向另一个对象,就会报错
    obj = {}; //报错

const最主要的就是变量的值不能改动,其他功能和let几乎一致。

区别

var、let、const区别总结

  • 变量提升
  • 暂时性死区
  • 块级作用域
  • 重复声明
  • 修改声明的变量

变量提升

var有变量提升,可以在变量声明之前调用它,但是值为undefined。

    console.log(num); //控制台打印 undefined
    var num = 10

let和const没有变量提升,不能再变量声明之前调用它,一旦调用就会报错

    console.log(num1);  //报错
    let num1 = 10
    
    console.log(num2);  //报错
    const num2 = 10

暂时性死区

var没有暂时性死区这种情况。因为可以在变量声明之前调用它。
let和const有暂时性死区,因为let和const只有声明之后才能获取和使用它,只要不是先声明后调用就会报错

    console.log(num1);  //报错
    let num1 = 10
    
    console.log(num2);  //报错
    const num2 = 10

块级作用域

var 没有块级作用域

{
    var num = 20
}
console.log(num)  //控制台打印 20

let 和 const 有块级作用域

{
    let num = 20
}
console.log(num)  // 报错


{
    const num1 = 20
}
console.log(num1)  // 报错

重复声明

var允许重复声明,

    var num = 10
    var num = 20
    console.log(num); //控制台打印 20

let和const不允许重复声明。

    let num = 20
    let num = 30  //报错
    const c = 10
    const c = 20  //报错

修改声明的变量

var和let可以修改。

     var num = 20
     num = 30
     console.log(num) //打印30
    let num = 20
     num = 30
     console.log(num) //打印30

const不能修改,它只是一个可读的常量,一旦声明了就不允许修改。

     const num = 20
     num = 30
     console.log(num) //报错

关于var、let、const区别差不多到这里就结束了,现在在开发中推荐的还是使用const和let,尽量的使用const,其他大多数情况下使用let,尽量避免使用var。