全网最全总结----var,let,const三者区别

4 篇文章 0 订阅
本文介绍了JavaScript ES6中新增的变量声明关键字let和const,对比了它们与var的区别。var存在变量提升和全局变量问题,而let和const则引入了块级作用域,避免了这些问题。let允许变量重新赋值,const则用于定义不可变的常量。在全局作用域中,let和const声明的变量不会挂载到window对象上,形成块级作用域。
摘要由CSDN通过智能技术生成

var,let,const

在ES6之前,JavaScript定义变量都是使用var,而在ES6之后,出现了两个新的定义变量的关键字let和const

var

  • 可以重复声明变量,但是后声明的变量会覆盖前面声明的同名变量

  • 声明的变量为全局变量,并且会将该变量添加为全局属性

  • 不存在块级作用域

  • 存在变量提升
    说这个需要先了JavaScript引擎是怎么工作的,它会先将整个脚本扫描一遍,将所有var定义的变量都先提升到开头,例如

    function test(){
      var a = 1
      ...
    }
    
    //会变成
    var a
    function test(){
      a = 1
      ...
    }
    
  • 不存在暂时性死区

  • var声明的变量会挂载在window上

let和const

  • 存在块级作用域

    • 这一特性解决了ES5的什么问题?
      • 内层变量可能会覆盖外层变量
      • 用来计数的循环变量泄露为全局变量
  • 不存在变量提升,即变量只能在声明之后才能使用,否则会报错

  • 不能重复声明变量

  • 存在暂时性死区

    只要进入当前作用域(有了块级作用域),所要使用的变量就已经存在了,但是不能获取,只有等到声明变量的那行代码出现,才可以获取和使用该变量

    • ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域,凡是在声明之前就使用这些变量,就会报错
    • let和const声明的变量不会挂载到window上,它形成了一个块级作用域
      • 那么在全局作用域中,let和const声明的变量哪去了?
        在es5中,全局变量会直接挂载到全局对象window的属性上, 但是在es6中,全局变量从全局对象中脱离出来,但是为了兼容性,使用var,function声明的全局变量依然可以在window对象上看到,但是let和const声明的全局变量在window对象上看不到,在script中形成一个块级作用域,在全局下可以如下面例子这么访问
      let a = 10
      const b = 20
      console.log(window.a)
      console.log(window.b)
      console.log(a)
      console.log(b)
      //输出
      undefined
      undefined
      10
      20	 
      

let

let创建的变量是可以更改指针指向,可以重新赋值

const

const声明的变量是不允许改变指针的指向

用来定义常量,定义变量后需要立即初始化,并且之后不能修改

这里说的不能修改,指的是不能修改变量指向的那个内存地址所保存的数据

这里情况分为两种讨论:

对于基本数据类型,变量所指向的内存地址保存着的就是它们原本的值,所以不可以修改

但是对于引用类型,如Object,变量指向的内存地址所保留的数据也只是个指针,这个指针是固定的,该指针指向的是在堆中开辟出来的一小块用于存储Object对象里的属性的内存空间(而一般像基本数据类型都是直接存储在栈中),至于这块内存空间存储的属性,是可以改变的,是不受控制的。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值