小云是一枚尚未脫髮的程序員,最近看到ES熱度這麼高,決定蹭一波熱度。程序員
小云首先看到了ES7中新增的**運算符,心中暗喜:這麼簡單?es6
8 ** 3 // 512
Math.pow(8, 3) // 512
複製代碼
可是小云喜歡瞎折騰,因而他又敲了下列代碼:算法
2 ** 2 ** 0 // 2
複製代碼
結果居然是2,小云帶着疑惑查了查資料,原來**運算符是右結合的:數組
(2 ** 2) ** 0 // 1
複製代碼
小云終於獲得了本身預期的結果,並且還發現了底數的前面不能緊跟一元運算符,即便是+也不行。學習
Tip: 爲何這個方法不叫contains呢?由於一些Bug,它被重命名爲includesui
接下來,小云開始學習includes方法:spa
[1, 2, 1].includes(1) // true
複製代碼
小云又敲下了以前用來判斷數組中的元素是否存在的代碼:prototype
if ([1, 2, 1].indexOf(1) !== -1) {
// true
}
複製代碼
哇!終於能夠擺脫那個使人討厭的!== -1了。code
難道這兩個方法僅僅是在返回值上有區別嗎?小云此次決定再也不瞎折騰,直接移步ES7文檔。cdn
數個小時以後,小云要開始他的表演了。
對於前兩個你們再熟悉不過了,在我剛學JS的時候,只是經過本身長期累積的經驗去區別二者的差別:
[1, 2, 3] == '1,2,3' // true
['1'] == 1 // true
複製代碼
以致於遇到上述狀況驚歎不已,可是瞭解原理以後,一切變得那麼的簡單。
NaN == NaN // false
-0 == 0 // true
複製代碼
前面兩條不難理解,經過['1'] == true比較的過程,熟悉一下第三條規則:
這時你再遇到:
[] == false // true
複製代碼
是否是很輕鬆就知道結果了。
對於這個算法須要注意的地方是在Number類型的比較上:
NaN === NaN // false
-0 === 0 // true
複製代碼
Tip: 上述方法的分析可能是基於ES5.1,在ES6中都有細微的改變,好比加入Symbol的比較。
對於熟練使用ES6的小夥伴,多知道Object.is()這個方法:
Object.is(NaN, NaN) // true
Object.is(0, -0) // false
複製代碼
而Object.is內部採用的比較算法就是SameValue(x, y),而它與 === 的區別也正是這兩種狀況。
可是你在使用es6中有沒有疑惑這種狀況:
const s = new Set()
s.add(0)
s.add(NaN)
s.has(-0) // true
s.has(NaN) // true
複製代碼
是否是與上述的三種算法的表現多不同,這就是第四種比較算法SameValueZero,它與SameValue的區別主要在於0與-0是否相等。
因此你在實踐includes方法時,遇到:
const a = [0, NaN]
a.includes(-0) // true
a.includes(NaN) // true
複製代碼
就不用大驚小怪了,由於includes內部使用的比較算法就是SameValueZero。
喜歡本文的小夥伴們,歡迎關注個人訂閱號超愛敲代碼,查看更多內容.