深入淺出ES6教程『let绿鸣、const』

?? 個人主頁歡迎訪問 ??


大家好,本人名叫蘇日儷格站玄,大家叫我 (格格) 就好枚驻,在上一章節(jié)中我們了解到一些關(guān)于ES6的知識,下面我們一起來繼續(xù)學(xué)習(xí)ES6的新特性let和const:

let和const都是定義(聲明)用的株旷,let是聲明變量再登,而const是聲明常量的;
變量:定義完了可以改變
常量:定義完了無法改變

var雖然也是聲明變量的晾剖,不過var聲明有很多潛在的問題锉矢,至于是哪些問題,讓我們來看一個例子:

for (var i=0; i<10; i++) {
    //coding
}
alert(i);  // i=10

小白:⊙⊙這不科學(xué)啊齿尽,在外面還能訪問沽损?
格格:這個時候有的朋友看了就感覺很神奇,尤其是學(xué)Java的循头,不應(yīng)該是這樣的對吧绵估,但事實如此,接著往下看你就明白了

如果非得說到作用域的問題的話卡骂,那么有兩種作用域国裳,一個是全局作用域,另一個就是函數(shù)作用域(局部作用域)全跨,在這個例子里面聲明的i就是一個全局的變量缝左,所以下面是可以訪問到的,如果下文繼續(xù)使用i的話浓若,那么就要從i=10開始渺杉,后果不堪設(shè)想。

下面我們再來看一個例子:

var a = 1;
function test(){
    alert(a);  // a = undefined
    var a = 2;
}
test();

這個例子暴露了一個問題挪钓,其實也不算是問題是越,就是因為JavaScript具有自己的特性:變量提升的問題和預(yù)解析的問題,這到底是個什么東西呢碌上?上面的例子可以也看成是下面的例子:

var a = 1;
function test(){
    var a;
    alert(a);
    a = 2;
}
test();

相信大家已經(jīng)看懂了英妓,在代碼執(zhí)行的過程中挽放,事先定義了一個a,這時并沒有賦值蔓纠,a當(dāng)然就是undefined辑畦;

由此我們給出一個定義:變量提升意思就是在js執(zhí)行之前,會把變量提到頂部腿倚,而且不會突破作用域纯出;再看一下預(yù)解析的例子:

<script type="text/javascript">
    var a = 1;
</script>
<script type="text/javascript">
    alert(a);  // a = 1
</script>

JavaScript雖然是一個腳本語言,無需解析敷燎,但是它還是有一個小小的預(yù)解析的過程:
讀取一個script標(biāo)簽 ==> 預(yù)解析 ==> 執(zhí)行代碼 ==> 再讀取下一個script標(biāo)簽 ==> ...依次循環(huán)

下面讓我們回到let和const:

for (let i=0; i<10; i++) {
    //coding...
}

alert(i);   // i is not defined

大家可以看到暂筝,同樣的例子使用let定義i的話,外面調(diào)用就會報錯硬贯,那么這又是因為什么呢焕襟?

這就是ES6中引入的新特性:塊級作用域
塊級作用域就是{ coding... } 只要是帶有{}的都是一個塊級作用域,下面到了考察大家的時刻了:

let a = 1;
function test(){
    alert(a);
    let a = 2;
}
test();

和之前的例子一樣饭豹,只不過將var換成了let鸵赖,這個時候的結(jié)果就是a is not defined,因為let只在塊級作用域中起作用拄衰,所以a不可能是1它褪,由于let不能提升,所以a就是未定義翘悉。
綜上所述:let的第一個特性就是不存在變量提升

小白:什么鬼茫打?什么叫做第一個特性,難道還有第二個特性不成 ?妖混?
格格:那么我要在這里恭喜你中了大獎了老赤,回家準(zhǔn)備買彩票吧,它確實有第二個特性<( ̄ˇ ̄)/

下面在讓我們一起看一個例子:

let a = 1;
let a = 2;
alert(a);

這個時候你會發(fā)現(xiàn)制市,它和var是有著非常大的區(qū)別的诗越,正常使用var的時候大家都知道,a肯定是等于2的息堂,那么在這里Identifier 'a' has already been declared,這句話的意思是a已經(jīng)被定義了块促,也就是說let不允許重復(fù)定義同一個變量

格格:這就是它的第二個特性了荣堰,接來下我們要講的就是let的第三個特性?(′?)?
小白:什么?o( ̄ヘ ̄o#) 還有第三個竭翠?
格格:其實第三個即是第二個振坚,第二個即是第三個つ﹏?

下面我們來看一個例子:

for (let i=0; i<10; i++) {
    let i = 2;
    console.log(i);
}

小白:so easy!i已經(jīng)被定義了唄
格格:嘿嘿斋扰,被忽悠了吧渡八,答案是輸出了10個2
小白:(???*) 為啥子嘛

剛才說到啃洋,不允許重復(fù)定義一個變量,但它的條件肯定是建立在塊級作用域下的呀屎鳍,這個循環(huán)中的i是作用域里面的i的父級宏娄,所以在里面還是可以定義的,第三個特性就算是給第二個加個補(bǔ)充:在不同作用域下逮壁,可以重復(fù)定義

小白:噢噢孵坚,剛才好像被晃了一下子→_→
格格:ㄟ( ▔, ▔ )ㄏ

const的特性和let是一模一樣的,不同的就只是常量而已窥淆,即為定義完了不能修改卖宠,否則報錯

下面又到了考察大家的時刻了:

const arr = ['aaa','bbb','ccc'];
arr.push('ddd');
console.log(arr);  // ["aaa", "bbb", "ccc", "ddd"]

小白:說好的不能修改了?你在逗我忧饭。扛伍。。
格格:哈哈词裤,你又不懂了吧

為什么會這樣刺洒?下面引用大神阮一峰的ECMAScript 6 入門

const實際上保證的,并不是變量的值不得改動亚斋,而是變量指向的那個內(nèi)存地址所保存的數(shù)據(jù)不得改動作媚。對于簡單類型的數(shù)據(jù)(數(shù)值、字符串帅刊、布爾值)纸泡,值就保存在變量指向的那個內(nèi)存地址,因此等同于常量赖瞒。但對于復(fù)合類型的數(shù)據(jù)(主要是對象和數(shù)組)女揭,變量指向的內(nèi)存地址,保存的只是一個指向?qū)嶋H數(shù)據(jù)的指針栏饮,const只能保證這個指針是固定的(即總是指向另一個固定的地址)吧兔,至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了袍嬉。因此境蔼,將一個對象聲明為常量必須非常小心。

這個arr是一個數(shù)組伺通,即是一個對象箍土,對象本身是存在引用的,如果想讓數(shù)組無法修改的話罐监,也有辦法的吴藻,可以用Object.freeze(對象)

格格:所以呀,var就當(dāng)做是你的前任弓柱,忘了吧...
小白:哪能說忘就忘沟堡,相信自己會慢慢接受現(xiàn)任的

關(guān)于let侧但、const我們都已經(jīng)了然于心,預(yù)知解構(gòu)賦值如何航罗,請聽下回分解 (^?^)/~~~

本文的所有內(nèi)容均是一字一句敲上去的禀横,希望大家閱讀完本文可以有所收獲,因為能力有限伤哺,掌握的知識也是不夠全面燕侠,歡迎大家提出來一起分享!謝謝O(∩_∩)O~

歡迎來我的GitHub立莉,喜歡的可以star绢彤,項目隨意fork,支持轉(zhuǎn)載但要下標(biāo)注蜓耻,同時恭候:我的博客 Resume

等一下( ?? .? ?? )茫舶,我還有最后一句話:
這里雖然沒有都市的繁華,
也沒有山林的鳥語花香刹淌,
只有一片如水的寧靜饶氏,
古人云:
既來之則安之,
既然來到了這里有勾,
就可以靜心休憩你的靈魂疹启,
調(diào)養(yǎng)你疲憊的心,
再見...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔼卡,一起剝皮案震驚了整個濱河市喊崖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雇逞,老刑警劉巖荤懂,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塘砸,居然都是意外死亡节仿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門掉蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廊宪,“玉大人,你說我怎么就攤上這事女轿〖簦” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵谈喳,是天一觀的道長。 經(jīng)常有香客問我戈泼,道長婿禽,這世上最難降的妖魔是什么赏僧? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮扭倾,結(jié)果婚禮上淀零,老公的妹妹穿的比我還像新娘。我一直安慰自己膛壹,他們只是感情好驾中,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著模聋,像睡著了一般肩民。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上链方,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天持痰,我揣著相機(jī)與錄音,去河邊找鬼祟蚀。 笑死工窍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的前酿。 我是一名探鬼主播患雏,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罢维!你這毒婦竟也來了淹仑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤言津,失蹤者是張志新(化名)和其女友劉穎攻人,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悬槽,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怀吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了初婆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓬坡。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖磅叛,靈堂內(nèi)的尸體忽然破棺而出屑咳,到底是詐尸還是另有隱情,我是刑警寧澤弊琴,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布兆龙,位于F島的核電站,受9級特大地震影響敲董,放射性物質(zhì)發(fā)生泄漏紫皇。R本人自食惡果不足惜慰安,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望聪铺。 院中可真熱鬧化焕,春花似錦、人聲如沸铃剔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽键兜。三九已至凤类,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蝶押,已是汗流浹背踱蠢。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留棋电,地道東北人茎截。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像赶盔,于是被迫代替她去往敵國和親企锌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • let 命令 塊級作用域 const 命令 頂層對象的屬性 global 對象 let 命令 基本用法 ES6 新...
    嘉奇呦_nice閱讀 1,625評論 0 2
  • let 和 const 命令 let 命令 塊級作用域 const 命令 頂層對象的屬性 gl...
    安小明閱讀 980評論 0 0
  • 本文屬個人筆記抖坪,不做詳解,僅供參考闷叉! let命令 基本用法 ES6 新增了let命令擦俐,用來聲明變量。它的用法類似于...
    R_yan閱讀 29,003評論 6 18
  • let 命令 塊級作用域 const 命令 頂層對象的屬性 global 對象 let 命令 基本用法 ES6 新...
    卞卞村長L閱讀 591評論 0 0
  • 昨兒小雪的節(jié)氣握侧,咱小鎮(zhèn)這卻只是細(xì)雨淅瀝蚯瞧。我念了許多許多遍“小雪”,口齒中吐露的模模糊糊的詞兒品擎,宛如呵出的團(tuán)團(tuán)熱氣埋合,...
    小深情閱讀 276評論 0 0