? ? ? ECMAScript6 的開(kāi)發(fā)花費(fèi)了四年之久焕议,之后TC-39決定縮短開(kāi)發(fā)周期惯雳,采用年度周期來(lái)發(fā)布語(yǔ)言的新特性邪驮,以確保語(yǔ)言的迭代速率與性能的快速發(fā)展候味。
? ? 由于開(kāi)發(fā)周期的縮短,可想而知的是此后每個(gè)新的ES版本擁有的新特性會(huì)比從ES5時(shí)代變到ES6時(shí)代時(shí)少許多洪灯。為了標(biāo)識(shí)這種新的變化坎缭,新版本號(hào)不再重點(diǎn)描述版本的數(shù)字代號(hào),而是改為指明規(guī)范發(fā)布的年份签钩,因此掏呼,ES6也被稱為ES2015,而ES7也正式被命名為ES2016铅檩。TC-39小組決定將來(lái)所有的ES版本都采用如上的年份命名規(guī)則憎夷。
? ? ES2016(ES7)于2016年3月定稿,并且只向語(yǔ)言添加了三項(xiàng)內(nèi)容:
一昧旨、一個(gè)新的數(shù)學(xué)運(yùn)算符
二拾给、一個(gè)新的數(shù)組方法
三富拗、一種新的語(yǔ)法錯(cuò)誤
新特性一、冪運(yùn)算符
1.冪運(yùn)算符的符號(hào)
? ? 冪運(yùn)算符是兩個(gè)星號(hào)(**)鸣戴,其左側(cè)是底數(shù),右側(cè)則是指數(shù)粘拾,
ex: let res = 10 ** 2;
console.log(res); //100
console.log( res === Math.pow(10,2) ); //true
使用Math.pow()能獲得相同的結(jié)果窄锅,但顯然運(yùn)算符比方法顯得更為直觀。
2.冪運(yùn)算符的優(yōu)先級(jí)
? ? 冪運(yùn)算符的優(yōu)先級(jí)在JavaScript的二元運(yùn)算符中是最高的(但低于一元運(yùn)算符)缰雇。
ex:let res = 5 * 10 ** 2;
console.log(res); //500
會(huì)首先計(jì)算冪入偷,再與5相乘來(lái)產(chǎn)生最終結(jié)果500
3.冪運(yùn)算符操作數(shù)的限制
? ? 冪運(yùn)算符有一個(gè)稍顯獨(dú)特的限制: 運(yùn)算符左側(cè)不能是除了 ++ 或 -- 之外的任意一元表達(dá)式,
ex:let res = -5 ** 2; // 語(yǔ)法錯(cuò)誤
因?yàn)?-(負(fù)號(hào)運(yùn)算符)的二義性械哟,程序會(huì)產(chǎn)生語(yǔ)法錯(cuò)誤疏之,因?yàn)?- 可以是 -5 也可以是 -25,如果想要消除-運(yùn)算符的二義性暇咆,需要額外添加括號(hào)锋爪,
ex:let res1 = - (5 ** 2); // 等于 -25
let res2 = (-5) ** 2; // 等于? 25
若為冪運(yùn)算表達(dá)式包裹括號(hào),那么 - 會(huì)作用在這整個(gè)表達(dá)式上爸业;而若你為 -5 包裹括
號(hào)其骄,則清楚表示想要獲取 -5 的二次冪。
在冪運(yùn)算符的左側(cè)表達(dá)式使用的是 ++ 或 -- 時(shí)扯旷,就無(wú)需使用括號(hào)拯爽,因?yàn)檫@兩個(gè)運(yùn)算符在操作數(shù)上的行為都被清晰定義了: ++ 或 -- 作為前綴會(huì)在其他任意運(yùn)算發(fā)生之前修改操作數(shù),而作為后綴則會(huì)在整個(gè)表達(dá)式計(jì)算完畢后才修改操作數(shù)钧忽。在冪運(yùn)算符左側(cè)的這兩種用法都是安全的毯炮,正如下面代碼所示:
let n = 2,
m = 2;
console.log(++n ** 2); // 9
console.log(n); // 3
console.log(m-- ** 2); // 4
console.log(m); // 1
此例中的 n 在冪運(yùn)算符被運(yùn)用之前就已被遞增,因此 n 會(huì)變?yōu)?3 耸黑,并且冪運(yùn)算的結(jié)果為 9 桃煎。而對(duì)于m 來(lái)說(shuō),在參與冪運(yùn)算時(shí)它的值仍然保持為 2 崎坊,在運(yùn)算之后才被遞減到1 备禀。
新特性二、Array.prototype.includes() 方法
? ? Array.prototype.includes() 方法接受兩個(gè)參數(shù):需要搜索的值奈揍、可選的搜索起始位置索引曲尸。當(dāng)提供了第二個(gè)參數(shù)時(shí), includes() 會(huì)從該位置開(kāi)始嘗試匹配(默認(rèn)的起始位置為 0 )男翰。若在數(shù)組中找到了該值另患,返回 true; 否則返回 false 。
ex: let vals = [1,2,3];
console.log(vals.includes(1)); //true
console.log(vals.includes(0)); //false
//從索引2開(kāi)始搜索
console.log(vals.includes(1,2)); //false
? ? 此處使用 1 去調(diào)用 vals.includes() 返回了 true 蛾绎,而使用 0 則會(huì)返回 false 昆箕,因?yàn)? 并不在此數(shù)組中鸦列。當(dāng)使用了第二個(gè)參數(shù)讓搜索從索引位置 2 (該位置的元素值是 3 )開(kāi)始進(jìn)行時(shí), vals.includes() 方法返回了 false 鹏倘,因?yàn)閿?shù)值 1 并不存在于位置 2 與數(shù)組末端之間薯嗤。
includes() 方法使用 === 運(yùn)算符來(lái)進(jìn)行值比較,僅有一個(gè)例外: NaN 被認(rèn)為與自身相等纤泵,盡管 NaN === NaN 的計(jì)算結(jié)果為 false 骆姐。這與 indexOf() 方法的行為不同,后者在比較時(shí)嚴(yán)格使用了 === 運(yùn)算符捏题。為了明白其中的差異玻褪,研究如下代碼:
let vals = [1, NaN, 2];
console.log(vals.indexOf(NaN)); // -1
console.log(vals.includes(NaN)); // true
vals.indexOf() 方法為 NaN 返回了 -1 ,盡管 NaN 實(shí)際上被包含在 vals 數(shù)組中公荧。
另一方面带射,由于使用不同的比較運(yùn)算符, vals.includes() 方法則為 NaN 返回了 true循狰。
在實(shí)現(xiàn)中的另一個(gè)怪異點(diǎn)是 +0 和 -0 被認(rèn)為是相等的窟社。在這個(gè)方面, indexOf() 與includes() 行為一致:
let vals = [1, +0, 2];
console.log(vals.indexOf(-0)); // 1
console.log(vals.includes(-0)); // true
此處的 indexOf() 與 includes() 都在傳入 -0 的時(shí)候找到了 +0 晤揣,因?yàn)樗鼈冋J(rèn)為這兩個(gè)值是相等的桥爽。注意這與 Object.is() 方法的行為有差異,后者認(rèn)為 +0 與 -0 是不同的值昧识。
新特性三钠四、函數(shù)作用域嚴(yán)格模式改動(dòng)
? ? ES2016 規(guī)定如果函數(shù)的參數(shù)被進(jìn)行解構(gòu)或是擁有默認(rèn)值,則在該函數(shù)內(nèi)部使用 "use strict" 指令將是違法的跪楞。當(dāng)函數(shù)體內(nèi)出現(xiàn)了 "use strict" 時(shí)缀去,該函數(shù)只允許使用簡(jiǎn)單參數(shù)列表(也就是所包含的參數(shù)沒(méi)有進(jìn)行解構(gòu),也沒(méi)有默認(rèn)值)甸祭。
ex:
// 沒(méi)有問(wèn)題缕碎,使用了簡(jiǎn)單參數(shù)列表
function okay(first, second) {
"use strict";
return first;
}
// 語(yǔ)法錯(cuò)誤
function notOkay1(first, second=first) {
"use strict";
return first;
}
// 語(yǔ)法錯(cuò)誤
function notOkay2({ first, second }) {
"use strict";
return first;
}
你依舊可以在只有簡(jiǎn)單參數(shù)列表的函數(shù)內(nèi)使用 "use strict" ,這也是 okay() 函數(shù)如預(yù)期正常工作的原因(就像在 ES5 中一樣)池户。 notOkay1() 函數(shù)則會(huì)有語(yǔ)法錯(cuò)誤咏雌,因?yàn)樗褂昧藚?shù)的默認(rèn)值。類似的校焦, notOkay2() 函數(shù)同樣有語(yǔ)法錯(cuò)誤赊抖,因?yàn)樗褂昧私鈽?gòu)參數(shù)。