NaN , isNN ()&数isnam ()


数型はいくつかの特別な値を持ち、そのうちの一つはNaNです.
この記事では、この特別な値で働くとき、私たちが必要とするもののいくつかを共有するつもりです.
私はあなたが記事に沿ってそれらを見つけるようにコードスニペットを試してお勧めします.

ネーミングは混乱している
をしましょうtypeof on NaN 返すものを見る
typeof NaN  // "number"
ご覧の通り、それはタイプとして「数」を返しますNaN 実際にnumber ... ちょっと待って!😮
したがって、この特別な値を何かのように命名した方が良いでしょう.
The NaN 特殊な値はnumber セット.我々が数学的な操作をしようとするとき、それは返されます、そして、それは失敗します.したがって、この場合、NaN 特殊な値が返される.

等高線
変数に格納された値がNaN , を使う=== または== 演算子はNaN は、それ自体に等しくない唯一の値です.
const x = 10 / "foo"

x === NaN    // false
x == NaN     // false

NaN !== NaN  // true


値がNaN値があるならば、我々がテストするのを助けることができる2つの方法がありますNaN . 組み込みのグローバルユーティリティメソッドを使用できますisNaN() またはNumber.isNaN() ユーティリティ.しかし、いつでも使用することをお勧めしますbellowを参照してくださいNumber.isNaN() の代わりにisNaN() . 試してみましょう
const y = Math.sqrt(-1)
const z = "bar"

isNaN(y)   // true
isNaN(z)   // true
isNaN(20)  // false
isNaN("55")// false

それはisNaN() ユーティリティはNaN 文字通り数ではない.
ちょっと気をつけましょう.🤔
それはisNaN() 論理は以下のようになります:
渡した値が特別な値のどちらかである(または評価する)NaN またはタイプのないものnumber ( typeof x !== "number" ), その後true "
しかし、これは明らかに正確ではありませんtypeof NaN === "number" , それで、それは戻りますtrue 特別な値である(または評価する)何かを渡すだけでNaN , そしてそれはfalse 値が数値型でない場合.
これについてもう少し詳しく説明しましょう.
代わりに、論理は次のようになります.
渡した値が文字通りの値ならばNaN リターンtrue , otherwise return false "
幸いなことに、ユーティリティのメソッドがisNaN ) これは、
const a = 20 / "foo"
const b = "bar"
const c = 35
const d = {}

Number.isNaN(a)   // true
Number.isNaN(b)   // false
Number.isNaN(c)   // false
Number.isNaN(d)   // false
この組み込みユーティリティメソッドのブラウザサポートをチェックする場合は、次のようになりますCan I Use: Number.isNaN .
しかし、それは94.06 %のグローバルサポートを持っていますので、ここで心配することはありません.IEはそれを支持しません、しかし、それはとにかくほとんど行きました.

数のためのポリフィールのカップル.イザナン
これらのポリフィルを書くことは、これらのユーティリティをもう少し理解するのを助けます.
if(!Number.isNaN) {
  Number.isNaN = function(n) {
    if( typeof n === "number" ) {
      return window.isNaN(n)
    } 
    return false
  }
}
したがって、この1つでは、値をフィルタリングし、number , もしそうならばisNaN ユーティリティ.
しかし、我々はより単純な解決策を使うことができますNaN はそれ自体に等しくない.見ましょう
if(!Number.isNaN) {
  Number.isNaN = function(n) {
    return n !== n
  }
}

エキストラ
また、Object.is() 2つの値が同じかどうかを調べるメソッド.コーナーケースもカバーしているので-0 === 0 // true でなければなりませんfalse この特定のケースではNaN 平等quirkも.
Object.is(NaN, NaN)  // true
あなたがより学びたいならばObject.is あなたはこのMDNに行くことができますlink .