簡(jiǎn)介
- ECMAScript 6.0(以下簡(jiǎn)稱(chēng) ES6)是 JavaScript 語(yǔ)言的下一代標(biāo)準(zhǔn)代赁,已經(jīng)在2015年6月正式發(fā)布了。它的目標(biāo)只盹,是使得 JavaScript 語(yǔ)言可以用來(lái)編寫(xiě)復(fù)雜的大型應(yīng)用程序闯第,成為企業(yè)級(jí)開(kāi)發(fā)語(yǔ)言。
- ES6 既是一個(gè)歷史名詞鲫骗,也是一個(gè)泛指,含義是5.1版以后的 JavaScript 的下一代標(biāo)準(zhǔn)踩晶,涵蓋了ES2015执泰、ES2016、ES2017等等渡蜻,而ES2015 則是正式名稱(chēng)术吝,特指該年發(fā)布的正式版本的語(yǔ)言標(biāo)準(zhǔn)。
let命令
- ES6新增了let命令茸苇,用來(lái)聲明變量排苍。它的用法類(lèi)似于var,但是所聲明的變量学密,只在let命令所在的代碼塊內(nèi)有效淘衙。
- 使用let時(shí)for循環(huán)還有一個(gè)特別之處,就是循環(huán)語(yǔ)句部分是一個(gè)父作用域则果,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的子作用域幔翰。
- 不存在變量提升漩氨。
- 暫時(shí)性死去:(只要塊級(jí)作用域內(nèi)存在let命令西壮,它所聲明的變量就“綁定”(binding)這個(gè)區(qū)域,不再受外部的影響)在代碼塊內(nèi)叫惊,使用let命令聲明變量之前款青,該變量都是不可用的。這在語(yǔ)法上霍狰,稱(chēng)為“暫時(shí)性死區(qū)”抡草。
- ES6明確規(guī)定饰及,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量康震,從一開(kāi)始就形成了封閉作用域燎含。凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)腿短。
- 不允許重復(fù)聲明 :let不允許在相同作用域內(nèi)屏箍,重復(fù)聲明同一個(gè)變量。
塊級(jí)作用域
ES5 只有全局作用域和函數(shù)作用域橘忱,沒(méi)有塊級(jí)作用域赴魁。
let實(shí)際上為 JavaScript 新增了塊級(jí)作用域。
塊級(jí)作用域的出現(xiàn)钝诚,實(shí)際上使得獲得廣泛應(yīng)用的立即執(zhí)行函數(shù)表達(dá)式(IIFE)不再必要了颖御。
ES5 規(guī)定,函數(shù)只能在頂層作用域和函數(shù)作用域之中聲明凝颇,不能在塊級(jí)作用域聲明潘拱。
ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)拧略。ES6 規(guī)定泽铛,塊級(jí)作用域之中,函數(shù)聲明語(yǔ)句的行為類(lèi)似于let辑鲤,在塊級(jí)作用域之外不可引用盔腔。
-
ES6在附錄B里面規(guī)定,瀏覽器的實(shí)現(xiàn)可以不遵守上面的規(guī)定月褥,有自己的行為方式弛随。
- 允許在塊級(jí)作用域內(nèi)聲明函數(shù)。
- 函數(shù)聲明類(lèi)似于var宁赤,即會(huì)提升到全局作用域或函數(shù)作用域的頭部舀透。
- 同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部决左。
do 表達(dá)式
- 塊級(jí)作用域之前加上do愕够,使它變?yōu)閐o表達(dá)式,從而使得塊級(jí)作用域可以變?yōu)楸磉_(dá)式佛猛,也就是說(shuō)可以返回值惑芭。
const命令
- const聲明一個(gè)只讀的常量(常量索引)。一旦聲明继找,常量的值就不能改變遂跟。
- 對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)幻锁。
- const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效凯亮。
- const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū)哄尔,只能在聲明的位置后面使用假消。
- const聲明的常量,也與let一樣不可重復(fù)聲明岭接。
- const實(shí)際上保證的置谦,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址不得改動(dòng)亿傅。
- 想將對(duì)象凍結(jié)媒峡,應(yīng)該使用Object.freeze方法。
ES6 聲明變量的六種方法
- var命令和function命令葵擎;(ES5 只有這兩種聲明變量的方法)
- let和const命令谅阿;
- import命令和class命令。
頂層對(duì)象的屬性
- 頂層對(duì)象酬滤,在瀏覽器環(huán)境指的是window對(duì)象签餐,在Node指的是global對(duì)象。ES5之中盯串,頂層對(duì)象的屬性與全局變量是等價(jià)的氯檐。
- ES6為了改變這一點(diǎn),一方面規(guī)定体捏,為了保持兼容性冠摄,var命令和function命令聲明的全局變量,依舊是頂層對(duì)象的屬性几缭;另一方面規(guī)定河泳,let命令、const命令年栓、class命令聲明的全局變量拆挥,不屬于頂層對(duì)象的屬性。也就是說(shuō)某抓,從ES6開(kāi)始纸兔,全局變量將逐步與頂層對(duì)象的屬性脫鉤。
global 對(duì)象
-
ES5的頂層對(duì)象否副,本身也是一個(gè)問(wèn)題汉矿,因?yàn)樗诟鞣N實(shí)現(xiàn)里面是不統(tǒng)一的:
- 瀏覽器里面,頂層對(duì)象是window副编,但 Node 和 Web Worker 沒(méi)有window负甸。
- 瀏覽器和 Web Worker 里面流强,self也指向頂層對(duì)象痹届,但是Node沒(méi)有self呻待。
- Node 里面,頂層對(duì)象是global队腐,但其他環(huán)境都不支持蚕捉。
-
同一段代碼為了能夠在各種環(huán)境,都能取到頂層對(duì)象柴淘,現(xiàn)在一般是使用this變量迫淹,但是有局限性:
- 全局環(huán)境中,this會(huì)返回頂層對(duì)象为严。但是敛熬,Node模塊和ES6模塊中,this返回的是當(dāng)前模塊第股。- 函數(shù)里面的this应民,如果函數(shù)不是作為對(duì)象的方法運(yùn)行,而是單純作為函數(shù)運(yùn)行夕吻,this會(huì)指向頂層對(duì)象诲锹。但是,嚴(yán)格模式下涉馅,這時(shí)this會(huì)返回undefined归园。
- 不管是嚴(yán)格模式,還是普通模式稚矿,new Function('return this')()庸诱,總是會(huì)返回全局對(duì)象。但是晤揣,如果瀏覽器用了CSP(Content Security Policy偶翅,內(nèi)容安全政策),那么eval碉渡、new Function這些方法都可能無(wú)法使用聚谁。
現(xiàn)在有一個(gè)提案,在語(yǔ)言標(biāo)準(zhǔn)的層面滞诺,引入global作為頂層對(duì)象形导。也就是說(shuō),在所有環(huán)境下习霹,global都是存在的朵耕,都可以從它拿到頂層對(duì)象。
箭頭函數(shù)
var f = v => v;
等價(jià)于:var f = function(v) {
return v;
};
- 箭頭函數(shù)有幾個(gè)使用注意點(diǎn)淋叶。
(1)函數(shù)體內(nèi)的this對(duì)象阎曹,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。
(2)不可以當(dāng)作構(gòu)造函數(shù)处嫌,也就是說(shuō)栅贴,不可以使用new命令,否則會(huì)拋出一個(gè)錯(cuò)誤熏迹。
(3)不可以使用arguments對(duì)象檐薯,該對(duì)象在函數(shù)體內(nèi)不存在。如果要用注暗,可以用Rest參數(shù)代替坛缕。
(4)不可以使用yield命令,因此箭頭函數(shù)不能用作Generator函數(shù)捆昏。
- 箭頭函數(shù)里面根本沒(méi)有自己的this赚楚,而是引用外層的this。
- 箭頭后面是大括號(hào)的代碼塊時(shí)需要在大括號(hào)外面加上小括號(hào)骗卜。
Class
- 類(lèi)的數(shù)據(jù)類(lèi)型就是函數(shù)宠页,類(lèi)本身就指向構(gòu)造函數(shù)。
- 直接對(duì)類(lèi)使用new命令膨俐,跟構(gòu)造函數(shù)的用法完全一致勇皇。
- 構(gòu)造函數(shù)的prototype屬性,在ES6的“類(lèi)”上面繼續(xù)存在焚刺。事實(shí)上敛摘,類(lèi)的所有方法都定義在類(lèi)的prototype屬性上面,在類(lèi)的實(shí)例上面調(diào)用方法,其實(shí)就是調(diào)用原型上的方法乳愉。
- 類(lèi)的內(nèi)部所有定義的方法兄淫,都是不可枚舉的(non-enumerable)。
- constructor方法是類(lèi)的默認(rèn)方法蔓姚,通過(guò)new命令生成對(duì)象實(shí)例時(shí)捕虽,自動(dòng)調(diào)用該方法。一個(gè)類(lèi)必須有constructor方法坡脐,如果沒(méi)有顯式定義泄私,一個(gè)空的constructor方法會(huì)被默認(rèn)添加。