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

2021-08-18 13:43:42 字數 3454 閱讀 7297

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

array.prototype.includes()

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

['my','mom','hates','me'].indexof('mom')  // 1

// 雖然有些難以理解,但返回值 1 表示 'mom' 字串在陣列中的索引值,而不是陣列中只有乙個 'mom'。

重點其實是「存在」。

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

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

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

var life = ['mom', 'dad', 'brother']

life.includes('mom')          // true

life.includes('girlfriend')   // false

深入標準

array.prototype.includes ( searchelement [ , fromindex ] )

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

規範中的內容如下:

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

# includes

# [1] searchs in ascending order

# 搜尋按公升序進行

> array(10000000).concat(4).includes(4)

true # [time] 500 miliseconds 耗時 500ms

> [4].concat(array(10000000)).includes(4)

true # [time] 90 miliseconds 耗時 90ms

# [2] uses samevaluezero algorithm

# 使用 samevaluezero 演算法比較

> [nan].indexof(nan)

-1> [nan].includes(nan)

true

# [3] if found at any position returns true

# otherwise, false is returned

# 在任何位置找到都會返回 true,否則返回 false

> [1, 2, 3].includes(2)

true

> [1, 2, 3].includes(7)

false

# [4] it treats missing array elements as undefined

# 將陣列中缺失的元素視為 undefined

> [1, , 3].indexof(undefined)

-1> [1, , 3].includes(undefined)

true

這裡的區別是元素 4 的位置。在第乙個例子中 4 位於陣列末尾,所以 includes 方法會搜尋整個陣列。按規範,.includes() 方法會在找到 searchelement 後立即返回,所以第二個例子執行地更快。

samevaluezero 演算法與嚴格相等比較(.indexof()採用)的最大區別就是它允許檢測 nan 元素。

元素被找到就返回 true,否則返回 false。不再使用索引作為結果了

與 .indexof() 相反,.includes() 並不會跳過缺失的陣列元素,而會將其視為 undefined。

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

規範中是這樣寫的:

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

# fromindex

# [1] it defaults to 0

# 預設為 0

> [1,2,3].includes(1)

true

# [2] if >= array.length, false is returned

# 如果 >= array.length, 返回 false

> [1,2,3].includes(1, 10)

false

# [3] if negative, it is used as the offset, i.e.

# 如果為負數,則被用作偏移

# offset = array.length + fromindex

> [1,2,3].includes(3, -2) # fromindex = 3 (array length) + -2 (fromindex) = 1

true

> [1,2,3].includes(1, -5) # fromindex = 0

true

如果不提供 fromindex 引數則預設其為 0 ,這時整個陣列都將被搜尋。

當 fromindex 大於陣列長度時,.includes() 立即返回 false。

如果 fromindex 是負值, 那麼起始索引計算方式為 array.length—fromindex 。這在搜尋陣列末尾元素時很有用。例如 fromindex = -5 意味著只搜尋最後 5 個元素。

為了避免 .includes() 執行中斷,當計算得到的起始索引小於 0 時,整個陣列會被搜尋。我個人更希望中斷

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

指數運算子(**)

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

是的,這一天已經到來。

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

# x ** y (aka math.pow(x,y))

> 2 ** 2

4> 2 ** 'operand'

nan

就這麼多!

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

650 只有兩個鍵的鍵盤

最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字n。你需要使用最少的操作次數,在記事本中列印出恰好n個 a 輸出能夠列印出n個 a ...

247 只有兩個鍵的鍵盤

題目描述 最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠...

650 只有兩個鍵的鍵盤

最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠列印出 n...