javascript的var與let,const之間的區(qū)別詳解
說(shuō)到JavaScript
中聲明變量的幾種方法也就是var
、let
、const
了,let
和const
是es6
中新增的命令。那么它們之間有什么區(qū)別呢?
我們先整體說(shuō)一下三者的區(qū)別,在詳細(xì)介紹,var、let、const的區(qū)別主要從以下幾點(diǎn)分析:
- 作為全局變量時(shí)的不同
- 變量提升
- 暫時(shí)性死區(qū)
- 塊級(jí)作用域
- 重復(fù)聲明
- 修改聲明的變量
作為全局變量時(shí)
在ES5
中,頂層對(duì)象的屬性和全局變量是等價(jià)的,用var
聲明的變量既是全局變量,也是頂層變量的屬性
但是ES6
中用let
聲明的變量可以在全局訪問(wèn)到,但是并沒(méi)有在頂層變量的屬性上,const
聲明的常量同樣也不會(huì)在頂層變量上
變量提升
var
聲明的變量存在變量提升,及變量可以在聲明之前調(diào)用,值為undefined
let
和const
不存在變量提升,即它們所聲明的變量一定要在聲明后使用,否則會(huì)報(bào)錯(cuò)
console.log(a) // undefinedvar a = 1console.log(b) // Cannot access 'b' before initializationlet b = 2console.log(c) // Cannot access 'c' before initializationconst c = 3console.log(a) // undefined var a = 1 console.log(b) // Cannot access 'b' before initialization let b = 2 console.log(c) // Cannot access 'c' before initialization const c = 3
暫時(shí)性死區(qū)
var
不存在暫時(shí)性死區(qū)
let
和const
存在暫時(shí)性死區(qū),只有等到聲明變量的那一行代碼被執(zhí)行后,才可以獲取和使用該變量
其實(shí)這一點(diǎn)就是有上一點(diǎn)變量提升延伸而來(lái)的區(qū)別。因?yàn)?code>var聲明的變量存在變量提升,在聲明之前使用該變量值為undefined
,不會(huì)報(bào)錯(cuò),所有沒(méi)有暫時(shí)性死區(qū)。let
、const
在該作用域開(kāi)始前后,變量或常量聲明之前使用會(huì)報(bào)錯(cuò),這一塊區(qū)域也就被稱為暫時(shí)性死區(qū)
例同上文:
console.log(a) // undefined var a = 1 console.log(b) // Cannot access 'b' before initialization let b = 2 console.log(c) // Cannot access 'c' before initialization const c = 3
塊級(jí)作用域
var
不存在塊級(jí)作用域
let
和const
存在塊級(jí)作用域
{ var a = 2}console.log(a) // 2{ let b = 2}console.log(b) // Uncaught ReferenceError: b is not defined{ const c = 2}console.log(c) // Uncaught ReferenceError: c is not defined
重復(fù)聲明
var
在相同作用域下允許重復(fù)聲明,后面聲明的變量會(huì)覆蓋前面的變量聲明
let
、const
在相同作用域下不允許重復(fù)聲明
var a = 10 var a = 20 // 20 let b = 10 let b = 20 // Identifier 'b' has already been declared const c = 10 const c = 20 // Identifier 'c' has already been declared
修改聲明的變量(常量與變量聲明)
var
和let
聲明的是變量,聲明后的變量可被修改
const
聲明得失常量,只讀。一旦聲明,常量的值就不能改變。但是需要注意的是,對(duì)于引用數(shù)據(jù)類型,JavaScript
中的變量或者常量存儲(chǔ)的是該數(shù)據(jù)的存儲(chǔ)地址,只要不直接修改該常量的引用,修改其指向的對(duì)象的屬性是可以的。
var a = 10 a = 20 console.log(a) // 20 let b = 10 b = 20 console.log(b) // 20 const c = 10 c = 20 // Uncaught TypeError: Assignment to constant variable
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript?深拷貝的循環(huán)引用問(wèn)題詳解
如果說(shuō)道實(shí)現(xiàn)深拷貝最簡(jiǎn)單的方法,我們第一個(gè)想到的就是?JSON.stringify()?方法,因?yàn)镴SON.stringify()后返回的是字符串,所以我們會(huì)再使用JSON.parse()轉(zhuǎn)換為對(duì)象,這篇文章主要介紹了JavaScript?深拷貝的循環(huán)引用問(wèn)題,需要的朋友可以參考下2022-12-12js為數(shù)字添加逗號(hào)并格式化數(shù)字的代碼
數(shù)字添加逗號(hào)的方法有很多,在本將為大家介紹下使用js來(lái)實(shí)現(xiàn),具體如下,感興趣的朋友可以參考下,希望對(duì)大家有所幫助2013-08-08JS可視化學(xué)習(xí)向量計(jì)算點(diǎn)到線段的距離并展示
這篇文章主要為大家介紹了JS可視化學(xué)習(xí)向量計(jì)算點(diǎn)到線段的距離并展示實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12JavaScript實(shí)現(xiàn)離開(kāi)頁(yè)面前提示功能【附j(luò)Query實(shí)現(xiàn)方法】
這篇文章主要介紹了JavaScript實(shí)現(xiàn)離開(kāi)頁(yè)面前提示功能,結(jié)合具體實(shí)例形式分析了javascript實(shí)現(xiàn)針對(duì)關(guān)閉頁(yè)面的事件響應(yīng)原理與操作技巧,并附帶jQuery的相應(yīng)實(shí)現(xiàn)方法,需要的朋友可以參考下2017-09-09JavaScript實(shí)現(xiàn)單擊網(wǎng)頁(yè)任意位置打開(kāi)新窗口與關(guān)閉窗口的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)單擊網(wǎng)頁(yè)任意位置打開(kāi)新窗口與關(guān)閉窗口的方法,涉及javascript窗口的相關(guān)操作函數(shù)與使用技巧,需要的朋友可以參考下2017-09-09javascript 返回?cái)?shù)組中不重復(fù)的元素
返回?cái)?shù)組中不重復(fù)的元素的js實(shí)現(xiàn)代碼。2009-12-12JS中const對(duì)于復(fù)雜類型變量和普通類型變量的區(qū)別詳解
我們?cè)陂_(kāi)發(fā)的過(guò)程中一定常常發(fā)現(xiàn)const關(guān)鍵字定義的簡(jiǎn)單類型變量不可以改變,但是你如果定義的是一個(gè)復(fù)雜類型變量(比如對(duì)象)的話對(duì)里面屬性的增刪改查是可以的,那這又是為什么呢,接下來(lái)就來(lái)和小編一起探討一下吧2023-11-11JavaScript給url網(wǎng)址進(jìn)行encode編碼的方法
這篇文章主要介紹了JavaScript給url網(wǎng)址進(jìn)行encode編碼的方法,實(shí)例分析了javascript中encodeURIComponent函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03