ECMAScript 2016(ES7)新特性簡介
阿新 • • 發佈:2021-03-12
# 簡介
自從ES6(ECMAScript 2015)在2015年釋出以來,ECMAScript以每年一個版本的速度持續向前發展。到現在已經是ECMAScript 2020了。
每個版本都有一些新的特性,今天本文將會講解ES7中帶來的新特性。
# TC39和ECMAScript
先講一下ECMA的歷史,ECMA在於1960年4月27日成立的製造商協會,其目的是統一標準,方便在不同的製造商之間移植。於是這個協會被命名為European Computer Manufacturers Association,簡稱ECMA。
在1994,為了體現ECMA協會的全球性活動,改名為歐洲標準化資訊和通訊系統協會 European association for standardizing information and communication systems。雖然名字還保留了歐洲的字樣,但是其本身已經是一個國際性協會了。
我們大概看一下ECMA協會的會員都有哪些,優先順序最高的會員叫做Ordinary Members,基本上都是國際的大公司組成的:
![](https://img-blog.csdnimg.cn/20201010203035109.png)
然後次一級的叫做Associate Members:
![](https://img-blog.csdnimg.cn/20201010203305833.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_0,text_aHR0cDovL3d3dy5mbHlkZWFuLmNvbQ==,size_25,color_8F8F8F,t_70)
可以看到裡面有幾個中國的公司,說明中國已經在世界上的規則制定方面有了一定的話語權。
TC39就是ECMA協會下屬的一個專門用來指定ECMAScript標準的委員會。TC的意思是 Technical Committees。
ECMA下屬的TC有很多個,而TC39專門就是負責ECMAScript的發展。
TC39下面又分為兩個Task groups。分別是:
* TC39-TG1 — General ECMAScript® Language 負責ECMAScript的發展
* TC39-TG2 — ECMAScript® Internationalization API Specification 負責ECMAScript國際化API的制定
我們知道ES5是在2009年制定的,而ECMAScript 2015 (ES6)是在2015年制定的,因為ES6包含了6年的改動,所以ES6的改動非常的大。
為了減少各大廠商對ECMA指令碼的升級適應壓力,從ES6之後,ECMA協會決定每年發一個ECMA版本。
下面給大家講解一下ECMAScript是怎麼釋出的。ECMAScript的釋出主要分為下面的5個階段:
* Stage 0: strawman
這是自由提交的階段,但是提交者必須是TC39 member 或者TC39 contributor。
* Stage 1: proposal
Stage 0的strawman被TC39 review之後,就到了proposal階段。
在這個階段必須知道誰來負責這個proposal,同時需要提交這個提案的示例,API以及語義和演算法的實現。還需要指明這個提案和現有的功能之間的可能衝突的地方。
如果這個提案被TC39接受了。那麼表示TC39將會繼續跟進這個提案。
* Stage 2: draft
這個是提案的第一個版本,該提案還必須具有對該功能的語法和語義的形式化描述(使用ECMAScript規範的形式語言)。描述需要應儘可能完整,但可以包含待辦事項和佔位符。
* Stage 3: candidate
這個階段的提案已經大部分完成了,需要根據使用者的反饋來進行下一步的調整。
* Stage 4: finished
這個階段的提案已經準備被包含在下一個ECMAScript的版本中了。
# ECMAScript 2016(ES7)的新特性
實際上,ECMAScript 2016(ES7)只有兩個新特性:
* Array.prototype.includes
* Exponentiation operator (**)
## Array的新方法includes
ES7為Array添加了新的方法includes,我們看下使用的例子:
~~~js
> ['a', 'b', 'c'].includes('a')
true
> ['a', 'b', 'c'].includes('d')
false
~~~
看一下includes的定義:
~~~js
Array.prototype.includes(value : any) : boolean
~~~
如果value包含在Array中,那麼將會返回true,如果沒有包含則會返回false。
可以看到includes和indexOf比較類似:
~~~js
arr.includes(x)
~~~
等價於:
~~~
arr.indexOf(x) >= 0
~~~
他們的區別在於,includes可以查詢NaN,而indexOf不能:
~~~js
> [NaN].includes(NaN)
true
> [NaN].indexOf(NaN)
-1
~~~
另外include是不區分+0和-0的:
~~~js
> [-0].includes(+0)
true
~~~
我們知道JS中的陣列除了Array之外,還有Typed Array,比如:
* Int8Array
* Uint8Array
* Uint8ClampedArray
* Int16Array
* Uint16Array
* Int32Array
* Uint32Array
* Float32Array
* Float64Array
* BigInt64Array
* BigUint64Array
所以includes方法也適用於TypedArray:
~~~js
let tarr = Uint8Array.of(12, 5, 3);
console.log(tarr.includes(5)); // true
~~~
## 冪操作符 **
ES7引入了冪操作符 ** :
~~~js
> 6 ** 2
36
~~~
上面的例子表示的是6的2次方。
x ** y 的值和 Math.pow(x, y) 是等價的。
我們看下冪操作符的基本使用:
~~~js
const squared = 3 ** 2; // 9
let num = 3;
num **= 2;
console.log(num); // 9
function dist(x, y) {
return Math.sqrt(x**2 + y**2);
}
~~~
冪操作符的優先順序是非常高的,** > * > +
~~~js
> 2**2 * 2
8
> 2 ** (2*2)
16
~~~
# 總結
ES7的新特性就這兩個,比較簡單,今天就介紹到這裡。
> 本文作者:flydean程式那些事
>
> 本文連結:[http://www.flydean.com/ecmascript-7/](http://www.flydean.com/ecmascript-7/)
>
> 本文來源:flydean的部落格
>
> 歡迎關注我的公眾號:「程式那些事」最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!