2017-10-19 146 views
3

我瞭解包括()功能,我發現這個代碼爲什麼這個JavaScript包含()功能有意義?

[NaN].includes(NaN) //True

NaN === NaN // False

這是爲什麼更多鈔票?

+2

爲什麼不可能?你可以很容易地定義你自己的比較值的邏輯:'function isSame(a,b){return isNaN(a)? isNaN(b):a === b;}'。如果你能做到這一點,那麼語言也可以做到。 –

回答

4

使用平等NaN === NaN和使用包括[NaN].includes(NaN)基本上要求兩個不同的問題:

  1. 平等 - 這東西有相同的名稱實際上是平等的嗎?

NaN是一個無定形實體,它描述了不是數值的概念,並且實際上沒有可以比較的值。平等使用Strict Equality Comparison,並定義在等式的任何一側的比較x === yNaN總是false

一個。如果x是NaN,則返回false。 b。如果y是NaN,則返回false。

  • 包括 - 我有與數組中的 「名」 的東西嗎?
  • 然而,搜索陣列中的一個NaN,並保持到陣列#包括僅通過一個特性參數的簽名,而不是回調,我們需要一種方法來「名」就是我們正在尋找。爲了做到這一點,ccording到Array#包括在ECMAScript 2016 (ECMA-262) docs定義:

    該方法包括有意地以兩種方式類似的indexOf 方法不同。首先,它使用SameValueZero算法 代替嚴格平等比較,允許它檢測NaN 數組元素。其次,它不會跳過丟失數組元素, 而是將它們視爲未定義。

    SameValueZero(x, y)定義指出比較時:

    如果x是NaN和y是NaN,返回true。

    0

    [ NaN ].includes(NaN)這是做什麼檢查NaN是否在[ ]

    NaN === NaNNaN == NaN仍將返回相同的值,即false。你只需要知道includes方法檢查一個值是否是它被調用的數組。罩後面我想使用typeof()

    typeof(NaN) // number 
    [ NaN ].includes(NaN) // true 
    
    typeof("1") // string 
    [ 1 ].includes("1") // false 
    
    typeof(1) // number 
    [ 1 ].includes(1) // true 
    

    此根據SameValueZero算法,該includes方法使用includes陣列方法做它的檢查。它在內部檢查值的類型