JavaScriptで数字かどうかの判定は?

JavaScriptで数値かどうかを判定する方法

JavaScriptで変数が数値かどうかを判定する方法はいくつかあります。適切な方法は、コードのコンテキストや期待される入力によって異なります。この文章では、いくつかの一般的な方法と、それぞれが適している状況について詳しく説明します。

1. `typeof` 演算子

`typeof` 演算子は、変数のデータ型を文字列として返します。数値の場合、"number" を返します。

<script>
  const num = 10;
  const str = "10";

  console.log(typeof num);  // "number"
  console.log(typeof str);  // "string"
</script>

ただし、`typeof` 演算子は、`NaN` (Not a Number) も "number" として扱うことに注意が必要です。

2. `isNaN()` 関数

`isNaN()` 関数は、値が数値に変換できない場合に `true` を返し、そうでない場合は `false` を返します。これは、ユーザー入力が数値に変換できるかどうかを確認する場合に便利です。

<script>
  console.log(isNaN(10));      // false
  console.log(isNaN("10"));     // false
  console.log(isNaN("hello"));  // true
  console.log(isNaN(NaN));     // true
</script>

3. `Number.isNaN()` メソッド

`Number.isNaN()` は静的メソッドで、渡された値が数値型の `NaN` であるかどうかを判定します。 入力が数値型でなかった場合は `false` を返します。 `isNaN()` 関数との違いは、`Number.isNaN()` は引数を数値に変換しようとしないことです。

<script>
  console.log(Number.isNaN(NaN));     // true
  console.log(Number.isNaN(10));      // false
  console.log(Number.isNaN("10"));     // false
  console.log(Number.isNaN("hello"));  // false 
</script>

4. `parseInt()` & `parseFloat()` 関数

文字列を数値に変換する必要がある場合は、`parseInt()` 関数または `parseFloat()` 関数を使用できます。これらの関数は、文字列を数値に変換できない場合に `NaN` を返します。

<script>
  console.log(parseInt("10"));    // 10
  console.log(parseFloat("10.5")); // 10.5
  console.log(parseInt("hello"));  // NaN
</script>

方法の比較

以下の表は、上記の方法の違いをまとめたものです。

方法 説明
`typeof` データ型が "number" かどうかを確認します。 `NaN` も "number" として扱われます。
`isNaN()` 値が数値に変換できるかどうかを確認します。数値に変換できない場合は `true` を返します。
`Number.isNaN()` 値が数値型の `NaN` であるかどうかを確認します。数値型でない場合は `false` を返します。
`parseInt()`, `parseFloat()` 文字列を数値に変換します。変換できない場合は `NaN` を返します。

参考資料

FAQ

Q1: `isNaN()` と `Number.isNaN()` の違いは何ですか?

A1: `isNaN()` は、引数を数値に変換しようとしますが、`Number.isNaN()` は変換しようとせず、引数が数値型の `NaN` かどうかを直接チェックします。そのため、`isNaN()` は `"hello"` のような文字列に対しても `true` を返しますが、`Number.isNaN()` は `false` を返します。

Q2: どの方法が最適ですか?

A2: 最適な方法は、状況によって異なります。 単純にデータ型が "number" かどうかを確認したい場合は `typeof` を使用します。 値が数値に変換できるかどうかを確認したい場合は `isNaN()` を使用します。 値が数値型の `NaN` かどうかを厳密に確認したい場合は `Number.isNaN()` を使用します。 文字列を数値に変換したい場合は `parseInt()` または `parseFloat()` を使用します。

Q3: `typeof NaN` が "number" を返すのはなぜですか?

A3: これは JavaScript の歴史的な理由によるものです。 `NaN` は IEEE 754 標準で定義された特別な数値であり、数値型として扱われます。 混乱を避けるために、`Number.isNaN()` を使用することをお勧めします。

その他の参考記事:JavaScript 関数呼び出し