ES7 只有兩個新功能,這是它們的工作原理

唐耶爾發表於2018-04-02

讓我們來聊一聊 JavaScript 新版本:ECMAScript 2016 (通常被稱為 ES7)。

ES7 帶來了兩個新功能:Array.prototype.includes() 和 新的指數運算子:**

Array.prototype.includes()

使用 .indexOf() 來確定一個元素是否在陣列中存在的方式已經成為歷史。

重點其實是“存在”

.indexOf() 的“本職工作”應該是用來確定某個值在陣列中的索引。

而如果我們的目的是確定一個元素是否在陣列中存在,那麼使用 .indexOf() 並不是最好的選擇。理由很簡單:當查詢某個東西的存在性時我們希望得到一個布林值,而不是數值

Array.prototype.includes() 做的恰恰就是這件事。它能確定陣列中是否包含給定元素,有就返回 true,否則返回 false

深入標準

Array.prototype.includes ( searchElement [ , fromIndex ] )

  • searchElement —— 要查詢的元素。
  • fromIndex (可選的) — 開始查詢的起始索引。

深入瞭解 規範,就像一次尋找力量之旅。

規範中的內容如下:

讓我們循序漸進,用一些例子來理解規範。

  1. 這裡的區別是元素 4 的位置。在第一個例子中 4 位於陣列末尾,所以 includes 方法會搜尋整個陣列。按規範,.includes() 方法會在找到 searchElement 後立即返回,所以第二個例子執行地更快。
  2. SameValueZero 演算法與嚴格相等比較.indexOf()採用)的最大區別就是它允許檢測 NaN 元素。
  3. 元素被找到就返回 true,否則返回 false。不再使用索引作為結果了
  4. .indexOf() 相反,.includes() 並不會跳過缺失的陣列元素,而會將其視為 undefined

你已經開始感受到力量了麼?我們還沒說 fromIndex 呢。

規範中是這樣寫的:

可選的第二引數 fromIndex 預設值為 0(這意味整個陣列都會被搜尋)。如果這個引數的值大於或等於陣列長度,則會直接返回 false ,陣列將不會被搜尋。如果值為是負數,則代表相對於陣列末尾的偏移量。如果偏移量超過陣列長度,則整個陣列都會被搜尋。

  1. 如果不提供 fromIndex 引數則預設其為 0 ,這時整個陣列都將被搜尋。
  2. fromIndex 大於陣列長度時,.includes() 立即返回 false
  3. 如果 fromIndex 是負值, 那麼起始索引計算方式為 array.length — fromIndex 。這在搜尋陣列末尾元素時很有用。例如 fromIndex = -5 意味著只搜尋最後 5 個元素。
  4. 為了避免 .includes() 執行中斷,當計算得到的起始索引小於 0 時,整個陣列會被搜尋。我個人更希望中斷 ?

好了——最後一個新功能……

指數運算子(**)

我們一直期待著指數計算也能像進行加減乘除一樣方便。

是的,這一天已經到來。

操作符 **Math.pow() 的行為一致。它返回第一個運算元的第二個運算元次的乘方值 (例如 x ** y)。

就這麼多!

現在你已經掌握 ES7 !好好用吧!

相關文章