跳轉到

2016:ECMAScript 2016——指數運算子#

事件#

2016年6月,ECMAScript 2016(ES7) 發佈——這是年度發佈制的第一個「小版本」,只有兩項新特性,象徵 TC39 從「六年大改版」轉向「每年小步快跑」。

新語法與特性#

1. 指數運算子 **#

  • 為何加入:ES5 求冪要呼叫 Math.pow(2, 10),函數呼叫無法與算術運算子混用(-x ** 2 這類表達式寫不出來)。
  • 理論原因:Python、Ruby 早已採用 **,語法直接借鑑;運算子的優先順序與結合性(右結合)按數學慣例定義。
  • 實用原因:數學計算(複利、演算法中的平方)寫成 2 ** 10 比 Math.pow 直觀。
  • 彌補缺陷:算術運算子族譜中缺冪運算的不完整性(+ - * / % 都有了,就差冪)。

2. Array.prototype.includes#

  • 為何加入:判斷陣列是否包含某值,以前只能 arr.indexOf(x) !== -1——語意迂迴,且 indexOf 用嚴格相等判斷,[NaN].indexOf(NaN) 回傳 -1(NaN 不等於自己)。
  • 理論原因:includes 採用 SameValueZero 演算法,能正確處理 NaN。
  • 實用原因:「包含判斷」是最常見的陣列操作之一,可讀性直接提升。
  • 彌補缺陷:indexOf 的語意迂迴與 NaN 判斷缺陷。

理論總結#

ES2016 證明年度發佈制的可行性:寧小勿等——與其累積六年再發一個 ES6,不如成熟一項發一項。這是 TC39 對 ES4 內戰(十年空窗)的組織性反思。

實用總結#

小版本讓 Babel 的轉譯負擔每年僅增加少量語法,瀏覽器也能快速跟進,「標準–瀏覽器落差」從五年縮短到數月。

相關條目#

程式範例#

1. 指數運算子:冪運算補齊算術族譜#

// ES5:函數呼叫
Math.pow(2, 10);   // 1024

// ES2016:運算子——可與其他算術混用、右結合
2 ** 10;           // 1024
2 ** 3 ** 2;       // 512(右結合:2 ** (3 ** 2),非 (2 ** 3) ** 2)
(-2) ** 2;         // 4(負底數要加括號,避免與一元負號混淆)
x ** 0.5;          // 開平方根,比 Math.pow 直觀

2. Array.prototype.includes:語意化與 NaN 修正#

// ES5:indexOf 迂迴 + NaN 缺陷
[1, 2, 3].indexOf(2) !== -1;   // true——語意繞路
[NaN].indexOf(NaN);            // -1(NaN !== NaN,嚴格相等判斷失敗!)

// ES2016:includes 採 SameValueZero,能處理 NaN
[1, 2, 3].includes(2);         // true——一眼看懂
[NaN].includes(NaN);           // true——NaN 判斷正確