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 判斷正確