這多是你學習ES7遺漏的知識點

小云是一枚尚未脫髮的程序員,最近看到ES熱度這麼高,決定蹭一波熱度。程序員

ES7新增的特性

  • Array.prototype.includes
  • **

**

小云首先看到了ES7中新增的**運算符,心中暗喜:這麼簡單?es6

8 ** 3 // 512
  Math.pow(8, 3) // 512
複製代碼

可是小云喜歡瞎折騰,因而他又敲了下列代碼:算法

2 ** 2 ** 0 // 2
複製代碼

結果居然是2,小云帶着疑惑查了查資料,原來**運算符是右結合的:數組

(2 ** 2) ** 0 // 1
複製代碼

小云終於獲得了本身預期的結果,並且還發現了底數的前面不能緊跟一元運算符,即便是+也不行。學習

Array.prototype.includes

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

數個小時以後,小云要開始他的表演了。

ES標準的相等比較算法

  • The Abstract Equality Comparison Algorithm (==)
  • The Strict Equality Comparison Algorithm (===)
  • SameValue (Object.is())
  • SameValueZero (暫未提供API)

對於前兩個你們再熟悉不過了,在我剛學JS的時候,只是經過本身長期累積的經驗去區別二者的差別:

[1, 2, 3] == '1,2,3' // true
  ['1'] == 1 // true
複製代碼

以致於遇到上述狀況驚歎不已,可是瞭解原理以後,一切變得那麼的簡單。

The Abstract Equality Comparison Algorithm

  • 當類型相同時,特殊性在於NaN, -0, 0。
NaN == NaN // false
  -0 == 0 // true
複製代碼
  • 當類型不一樣時,第一條準則是:null與undefined相等
  • 當類型不一樣時,第二條準則是:全部的比較最終多會轉化爲數值的比較,而它轉化的優先級是Boolean => Object => String

前面兩條不難理解,經過['1'] == true比較的過程,熟悉一下第三條規則:

  • 將右邊的Boolean類型轉化爲Number類型, 轉化爲 ['1'] == 1
  • 將左邊的Object類型轉化爲原始值,轉化爲 '1' == 1
  • 將左邊的String類型轉化爲Number類型, 轉化爲 1 == 1

這時你再遇到:

[] == false // true
複製代碼

是否是很輕鬆就知道結果了。

The Strict Equality Comparison Algorithm

對於這個算法須要注意的地方是在Number類型的比較上:

NaN === NaN // false
  -0 === 0 // true
複製代碼

Tip: 上述方法的分析可能是基於ES5.1,在ES6中都有細微的改變,好比加入Symbol的比較。

SameValue

對於熟練使用ES6的小夥伴,多知道Object.is()這個方法:

Object.is(NaN, NaN) // true
  Object.is(0, -0) // false
複製代碼

而Object.is內部採用的比較算法就是SameValue(x, y),而它與 === 的區別也正是這兩種狀況。

SameValueZero

可是你在使用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。

參考文獻


    喜歡本文的小夥伴們,歡迎關注個人訂閱號超愛敲代碼,查看更多內容.

相關文章
相關標籤/搜索