• 字节一面:说说var、let、const之间的区别


    前言

    最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,熟练掌握js是我们的必备技能,var、let、const之间的区别我们也得熟练掌握,博主在这给大家细细道来。


    🚀 作者简介:程序员小豪,全栈工程师,热爱编程,曾就职于蔚来、腾讯,现就职于某互联网大厂,技术栈:Vue、React、Python、Java
    🎈 本文收录于小豪的前端系列专栏,后续还会更新前端入门以及前端面试的一些相关文章,手把手带你从零学习前端到面试找工作,并如果有想进入前端领域工作的同学,这个前端专栏会对你有所帮助,欢迎关注起来呀
    🌼 本人也会持续的去关注AIGC以及人工智能领域的一些动向并总结到博客中,大家感兴趣的可以关注一下我的人工智能专栏
    🌊 云原生的入门学习系列,大家有兴趣的可以看一看

    一、var

    在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量既是全局变量,也是顶层变量

    注意:顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象

    var a = 10;
    console.log(window.a) // 10
    
    • 1
    • 2

    使用var声明的变量存在变量提升的情况

    console.log(a) // undefined
    var a = 20
    
    • 1
    • 2

    在编译阶段,编译器会将其变成以下执行

    var a
    console.log(a)
    a = 20
    
    • 1
    • 2
    • 3

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

    var a = 20 
    var a = 30
    console.log(a) // 30
    
    • 1
    • 2
    • 3

    在函数中使用使用var声明变量时候,该变量是局部的

    var a = 20
    function change(){
        var a = 30
    }
    change()
    console.log(a) // 20 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    而如果在函数内不使用var,该变量是全局的

    var a = 20
    function change(){
       a = 30
    }
    change()
    console.log(a) // 30 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    二、let

    letES6新增的命令,用来声明变量

    用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效

    {
        let a = 20
    }
    console.log(a) // ReferenceError: a is not defined.
    
    • 1
    • 2
    • 3
    • 4

    不存在变量提升

    console.log(a) // 报错ReferenceError
    let a = 2
    
    • 1
    • 2

    这表示在声明它之前,变量a是不存在的,这时如果用到它,就会抛出一个错误

    只要块级作用域内存在let命令,这个区域就不再受外部影响

    var a = 123
    if (true) {
        a = 'abc' // ReferenceError
        let a;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用let声明变量前,该变量都不可用,也就是大家常说的“暂时性死区”

    最后,let不允许在相同作用域中重复声明

    let a = 20
    let a = 30
    // Uncaught SyntaxError: Identifier 'a' has already been declared
    
    • 1
    • 2
    • 3

    注意的是相同作用域,下面这种情况是不会报错的

    let a = 20
    {
        let a = 30
    }
    
    • 1
    • 2
    • 3
    • 4

    因此,我们不能在函数内部重新声明参数

    function func(arg) {
      let arg;
    }
    func()
    // Uncaught SyntaxError: Identifier 'arg' has already been declared
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、const

    const声明一个只读的常量,一旦声明,常量的值就不能改变

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

    这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值

    const a;
    // SyntaxError: Missing initializer in const declaration
    
    • 1
    • 2

    如果之前用varlet声明过变量,再用const声明同样会报错

    var a = 20
    let b = 20
    const a = 30
    const b = 30
    // 都会报错
    
    • 1
    • 2
    • 3
    • 4
    • 5

    const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动

    对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量

    对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变

    const foo = {};
    
    // 为 foo 添加一个属性,可以成功
    foo.prop = 123;
    foo.prop // 123
    
    // 将 foo 指向另一个对象,就会报错
    foo = {}; // TypeError: "foo" is read-only
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其它情况,constlet一致

    四、区别

    varletconst三者区别可以围绕下面五点展开:

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

    变量提升

    var`声明的变量存在变量提升,即变量可以在声明之前调用,值为`undefined
    
    • 1

    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 'c' before initialization
    const c = 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    暂时性死区

    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 'c' before initialization
    const c = 10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    块级作用域

    var不存在块级作用域

    letconst存在块级作用域

    // var
    {
        var a = 20
    }
    console.log(a)  // 20
    
    // let
    {
        let b = 20
    }
    console.log(b)  // Uncaught ReferenceError: b is not defined
    
    // const
    {
        const c = 20
    }
    console.log(c)  // Uncaught ReferenceError: c is not defined
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    重复声明

    var允许重复声明变量

    letconst在同一作用域不允许重复声明变量

    // var
    var a = 10
    var a = 20 // 20
    
    // let
    let b = 10
    let b = 20 // Identifier 'b' has already been declared
    
    // const
    const c = 10
    const c = 20 // Identifier 'c' has already been declared
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修改声明的变量

    varlet可以

    const声明一个只读的常量。一旦声明,常量的值就不能改变

    // var
    var a = 10
    a = 20
    console.log(a)  // 20
    
    //let
    let b = 10
    b = 20
    console.log(b)  // 20
    
    // const
    const c = 10
    c = 20
    console.log(c) // Uncaught TypeError: Assignment to constant variable
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    使用

    能用const的情况尽量使用const,其他情况下大多数使用let,避免使用var

    总结

    各位看官老爷们好,小豪已经建立了技术交流群,如果你很感兴趣,可以私信我加入我的社群。

    📝社群中不定时会有很多活动,例如学习资料分享、大厂面经分享、技术讨论、行业大佬创业杂谈等等。

    📝本人目前是在互联网大厂正式工作,也有过多个大厂的工作经历,加入社群也会有简历修改辅导,模拟面试,手把手项目实战教学,大厂工作内推机会以及大厂面试题解析分享等福利。

    📝社群方向很多,相关领域有Web全栈(前后端)、人工智能、AIGC、自媒体变现、前沿科技文章分享、论文精读等等。

    📝不管你是多新手的小白,都欢迎你加入社群中讨论、聊天、分享,加速助力你成为下一个技术大佬!也随时欢迎您跟我沟通,一起交流,一起成长。变现、进步、技术、资料、项目、你想要的这里都会有

    📝网络的风口只会越来越大,风浪越大,鱼越贵!欢迎您加入社群~一个人可以或许可以走的很快,但一群人将走的更远!

    📝想都是问题,做都是答案!行动起来吧!欢迎评论区or后台与我沟通交流,也欢迎您扫描下方二维码直接加入到我的交流社群!(微信:adcoderhao)

  • 相关阅读:
    【一起学Rust | 进阶篇 | RMQTT库】RMQTT消息服务器——安装与集群配置
    打印剪刀手“耶”(V形)
    搜索引擎:引擎霸屏推广的未来趋势解读-华媒舍
    C语言—字符函数和字符串函数
    数学建模学习(104):线性回归和多元回归【补充版】
    【库存控制】基于蜜蜂算法优化库存控制附matlab代码
    趣味算法-读书笔记(三)
    C语言 - 通讯录详解
    TS查漏补缺【类型守卫】
    线性代数学习笔记7-1:特征值、特征向量、迹、特征基
  • 原文地址:https://blog.csdn.net/A_D_H_E_R_E/article/details/132920917