JavaScript重点:深入浅谈var、let和const之间的区别

前言:

在早期的ES标准中,只有var一种声明类型。经过了好几年的探索,欧洲电子协会终于在2015年发布了ES6标准,新增加了letconst两个重要关键字。如今对于大多数的互联网企业来说,他们也已经慢慢采用了ES6规范。所以,如果你在通篇js中只使用var去声明甚至不去声明,那么你的js代码是非常糟糕且难于理解的。在真正的互联网企业中,你这种行为也是会被痛批的。(此处应有笑脸)所以我们很有必要去深入地了解var、let和const之间的区别,做到规范写代码。


  • 首先我们看一下下面这份表:

    var let const
    初始值 不需要 不需要 需要
    重复声明 允许 不允许 不允许
    变量提升 允许 不允许 不允许
    作用域 全局、局部 块级 块级
    暂存死区 不会

    !!!敲重点,这个表格大家一定背熟,面试时基本都会问到

    下面我们结合代码来一个个详细地介绍它们的区别,做到知其然,亦知其所以然

    1、初始值

    (1)var、let声明变量可以赋值也可以不赋值:

    var initialValue;//initialValue还没赋值,合法
    
    var initialValue = 2;//initalValue = 2,合法
    
    let initialValue;//initialValue还没赋值,合法
    
    let initialValue = 3;//initialValue = 3,合法
    

    (2)const声明变量同时必须赋值:

    const initialValue;//initialValue还没赋值,不合法
    
    const initialValue = 4;//initialValue = 4,合法
    

    2、重复声明

    (1)var允许重复声明:

    <script>
     var i = 10;//i = 10
     var i = 2;//此时i = 2
     var i = 5;//此时i = 5
     if(1) {
            var i = 100;//此时i = 100
        }
     console.log(i);//此时i = 100
    </script>
    

    注:所以大家发现了吗,当我使用var声明一个变量时,我可以对同一个变量进行赋值,其变量最终的值为最后声明的那次。

    (2)let、const不允许重复声明:

    <script>
        let a = 100;//a = 100,合法
     let a = 10;//不合法
     const x = 20;//x = 20,合法
     const x = 2;//不合法
    </script>
    
    

    注:从上面代码可以看出,当我们使用let或者const声明一个变量的值时,这个变量就不能再使用let、const去声明了,但是并不代表不能再赋值。这是两个不一样的意思,var、let声明的是可以重新赋值的,而const是不能重新赋值的。

    3、变量提升

    (1)var允许变量提升:

    <script>
        x = 10;
     var x;
     console.log(x);//此时控制台输出x = 10;
    </script>
    

    注:在JavaScript中,允许var关键字声明的变量可以先使用后再声明。

    (2)let、const不允许变量提升:

    <script>
        x = 10;
     let x;
     console.log(x);//此时控制台输出undefined
     y = 10;
     const y;
     console.log(y);//报错,因为y没有赋值
    </script>
    

    注:从上面代码可以看出let和const不允许变量先使用后再声明。但是在日常的编写代码习惯中,很少有人会先使用变量后再声明,因为这是不符合代码逻辑的。因此,重在了解,这个对我们代码编写没多大用处。

    4、作用域

    (1)var的作用域包含全局和局部,除了块级之外(什么是块级作用域下面会说到):

    <script>
        var x = 1;//在函数外声明的变量的作用域是全局的
     for(let i = 0;i<5;i++){
            var x = 100;//在函数内声明的变量的作用域是局部的
        }
     console.log(x);//可以访问,x=100
    </script>
    

    (2)let、const的作用在块级内:

    <script>
        let x = 1;
     for(let i=0;i<1;i++){
            let x = 5;
            console.log(x);//x=5
        }
     console.log(x);//x=1
    </script>
    

    注:从上面代码可以看出,像{}就叫做块,使用let声明的变量互不影响,变量只在其作用域内有意义。至于const的也是同理,这里不再赘述。一般我们使用const都是在全局中声明常量。

    5、暂存死区

    (1)var不会暂存死区:

    <script>
        var a = 10;
     if(1){
            a = 100;
            var a;
        }
     console.log(a);//控制台输出a = 100
    </script>
    

    (2)let和const会暂存死区:

    <script>
        let a = 10;
     if(1){
            a = 100;
            let a;
        }
     console.log(a);//报错,找不到a
     const b = 20;
     if(1){
            b = 200;
            const b;
        }
     console.log(b);//报错,找不到b
    </script>
    

    注:如果代码块中存在let或者const命令,那么块就会对这些命令声明的变量形成一个封闭作用域,因此在声明前使用变量就会出错,而var就不会。但是在代码编写中也很少会这样编写,重在了解。

    const关键字

    前面有提到const在声明变量时必须赋值,也就是初始化,且初始化不能再更改。例如:

    <script>
     const a = 1111;
     a = 100;//报错
    </script>
    

    但是本质上const声明的变量并不是常量,并不是一定不能改变的,真正的含义是定义了一个常量引用的一个值,当我们使用const初始化一个数组或者对象时,其实是可以改变的,例如:

    const person ={
          id:1,
          name:'Tang_Xiaokang',
          age:20,
          tele:123456789
     };
    person.id = 4;//此时对象person的属性id已经改为4
    console.log(person.id);//输出4
    person ={
          id:34,
          name:'tangxiaokang',
          age:100,
          tele:987654321
     };//此时会报错
    

    注:从上面代码可以看到,对一个对象使用const进行初始化时,整个对象是不可以重新赋值的,但是我们是可以修改对象里面的每一个属性的。因为对象里面的属性并没有使用const关键字。(重点!!!)


最后,经过上面的学习,相信你已经充分了解它们之间的区别。但是,学习了理论还不够,我们更要在日常编写代码中使用才行。所以,我们应该如何正确的使用这些关键字呢?下面我再简单讲一下它们的使用场景:

const PI = 3.14;
var x = 100;
let y = 20;
for(let i = 0;i<100;i++){
    //一些代码...
}

所以,它们的优先级可以是:const > let > var。用const声明变量一般表明了其变量是不能再改变了,也就是通常讲的常量。对于var,一般我们可以在块或函数外面使用,而在块级里面我们一般使用let较多。自从ES6标准提出后,let其实完全可以取代var,因为两者作用差不多,重点是let没有副作用!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,783评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,396评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,834评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,036评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,035评论 5 362
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,242评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,727评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,376评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,415评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,463评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,140评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,734评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,809评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,028评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,521评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,119评论 2 341

推荐阅读更多精彩内容