溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript變量中var,let和const的區(qū)別是什么

發(fā)布時間:2022-09-14 09:58:36 來源:億速云 閱讀:142 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“JavaScript變量中var,let和const的區(qū)別是什么”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JavaScript變量中var,let和const的區(qū)別是什么”文章能幫助大家解決問題。

    前言

    JavaScript中一共有3種用來聲明變量的關(guān)鍵字,分別是var、let和const。

    其中var關(guān)鍵字是ES5時代的產(chǎn)物,由于ES5對變量的約束很寬松,使用var來聲明變量時經(jīng)常會出現(xiàn)一些預(yù)料之外的問題。 ES6為了使變量的定義更加規(guī)范,提出了let和const這兩個關(guān)鍵字。

    因此要解釋清楚這三個的區(qū)別,首先要從ES5時代和ES6時代的差別說起,主要是var和let的區(qū)別。

    ES5與ES6的區(qū)別

    1. 作用域

    使用不同的關(guān)鍵字來聲明變量,主要就是對變量的作用域有不同的限制,因此var和let最主要的區(qū)別就是變量作用域的區(qū)別。

    • var聲明的范圍是函數(shù)作用域,函數(shù)體之外無法訪問到函數(shù)體內(nèi)聲明的var變量。

    做題的時候經(jīng)常會有在全局和函數(shù)體內(nèi)聲明同名變量的場景,要知道不同作用域的變量是不會互相干擾的。

    var a = 10;
    function logA() {
        var a = 20;
        console.log(a); // 20
    }
    console.log(a); // 10
    • let聲明的范圍是塊作用域,塊作用域是函數(shù)作用域的子集,可以使用花括號{...}來限定塊級作用域。

    2. 全局屬性

    在全局作用域下使用var和let聲明變量,變量都是會在頁面的聲明周期內(nèi)存續(xù)。

    但是使用var聲明的變量會成為window對象的屬性,使用let聲明則不會。

    3. 變量提升與暫時性死區(qū)

    • var聲明存在變量提升的行為。

    變量的聲明、初始化和賦值被分為三步進行,對于var變量,聲明和初始化會被提升到作用域的頂部。

    也就是說,編譯器在遇到var聲明時,會先在作用域頂部聲明一個var變量并將其初始化為undefined值。

    因此在代碼執(zhí)行流遇到var聲明語句之前訪問var變量并不會報錯,而是會訪問到undefined值。

    (function example() {
      console.log(age); // undefined
      var age = 20;
    })();
    
    // 相當于
    (function example() {
      var age;
      console.log(age); // undefined
      age = 20;
    })();
    • ES6對先訪問后聲明變量的行為做了約束,因此let和const聲明會存在TDZ暫時性死區(qū)

    即JavaScript引擎在編譯時如果遇到let和const聲明,會將它們放入暫時性死區(qū)以阻止訪問,只有在執(zhí)行到變量聲明的語句后,才會將變量從TDZ中移出。

    因此如果在變量聲明語句之前訪問變量,相當于企圖訪問TDZ中的變量,JavaScript會拋出運行時錯誤ReferenceError。

    ES5的變量提升和ES6的暫時性死區(qū)的區(qū)別還有一個“副作用”就是改變了typeof操作對于變量的訪問性。

    已知在ES5時對于未聲明變量唯一的安全操作是typeof,會返回undefined值。

    TDZ的出現(xiàn)導致即使使用typeof,也不能在let和const聲明語句執(zhí)行之前訪問let和const變量,依然會報ReferenceError。

    4. 重復聲明

    • var聲明是允許重復的,可以重復使用var關(guān)鍵字來聲明同名變量,后來聲明的變量值會覆蓋之前的值。

    • 為了阻止重復聲明變量這個容易讓人迷惑的行為,ES6限制了let和const聲明的變量都是不可重復的,如果重復聲明會報SyntaxError錯誤。

    這個限制不僅體現(xiàn)在let聲明對let聲明,如果想用let去重復聲明var變量也是不被允許的。

    let與const的區(qū)別

    1. 常量

    同樣都是ES6的變量聲明關(guān)鍵字,let和const的區(qū)別就在于使用const聲明創(chuàng)建的是一個值的只讀引用

    只讀引用意味著對于原始值來說,const聲明不可以再重新賦值;

    對于引用值來說,const聲明不可以再修改引用,但是可以修改對象的屬性值或者數(shù)組內(nèi)部的值。

    最佳實踐

    • 盡量不使用var。因為let和const已經(jīng)可以替代var的位置,滿足開發(fā)需求,順便還規(guī)避了很多不必要的問題。

    • 優(yōu)先使用const聲明,let聲明次之。const聲明有點像保護變量的機制,它能預(yù)防和阻止預(yù)期之外的變量修改。 對于有修改需求的變量,就使用let聲明。

    關(guān)于“JavaScript變量中var,let和const的區(qū)別是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI