このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

isNaN()

Baseline 広く利用可能

この機能は広く実装されており、多くのバージョンの端末やブラウザーで動作します。2015年7月以降、すべてのブラウザーで利用可能です。

isNaN() 関数は、必要に応じてまず値を数値に変換してから、引数が NaN (非数) かどうかを判定します。 isNaN() 関数内の型変換は予想外の結果になることがあるため、 Number.isNaN() を使用することをお勧めします。

試してみましょう

function milliseconds(x) {
  if (isNaN(x)) {
    return "Not a Number!";
  }
  return x * 1000;
}

console.log(milliseconds("100F"));
// 予想される結果: "Not a Number!"

console.log(milliseconds("0.0314E+2"));
// 予想される結果: 3140

構文

js
isNaN(value)

引数

value

テストされる値。

返値

指定された値を数値に変換した後で NaN であれば、 true を返します。それ以外の場合は、 false を返します。

解説

isNaN() は、グローバルオブジェクトの関数プロパティです。

数値の場合、 isNaN() は、その数値が NaN であるかどうかを検査します。 isNaN() 関数の引数が数値型でない場合、その値はまず数値に変換され、その結果が NaN と比較されます。

数値以外の引数に対する isNaN() のこの動作は、紛らわしいかもしれません。例えば、空文字列は 0 に強制変換されますが、論理値は 0 または 1 に強制変換されます。どちらの値も直感的には「数値ではない」ですが、 NaN と評価されないため、 isNaN()false を返します。したがって、 isNaN() は、「入力は浮動小数点 NaN 値であるか」という質問にも、「入力は数値ではないか」という質問にも答えません。

Number.isNaN() は、値が数値 NaN であるかどうかを検査する、より信頼性の高い方法です。あるいは、式 x !== x を使用することもできます。どちらの解決策も、グローバルな isNaN() の信頼できない誤検出の影響を受けません。値が数値であるかどうかを検査するには、 typeof x === "number" を使用してください。

isNaN() 関数は、「入力は、数値コンテキストで使用した場合、 NaN と機能的に同等であるか」という質問に答えます。 isNaN(x)false を返す場合、 xNaN ではない有効な数値であるかのように、算術式で使用することができます。 isNaN(x)true を返す場合、 xNaN に強制変換され、ほとんどの算術式は NaN を返します(NaN は伝播するため)。これを使用すると、例えば、関数の引数が算術処理可能(数値と同様に使用可能)であるかどうかをテストし、数値ではない値の場合にエラーを発生させたり、既定値を提供して処理させたりすることができます。このようにして、コンテキストに応じて値を暗黙的に変換することで、 JavaScript が提供する汎用性を最大限に活用する関数を持つことができます。

メモ: + 演算子は、数値の加算と文字列の連結の両方を実行します。したがって、 isNaN() が両方のオペランドに対して false を返した場合でも、 + 演算子は算術演算子として使用されないため、文字列を返す場合があります。例えば、 isNaN("1")false を返しますが、 "1" + 1"11" を返します。確実に数値で処理を行うには、値を数値に変換し、 Number.isNaN() を使用して結果を検査してください。

isNaN() は、値 NaN でなく、数値でもない値に対して true を返すことに注意してください。

js
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true

isNaN(true); // false
isNaN(null); // false
isNaN(37); // false

// 文字列
isNaN("37"); // false: "37" は非数でない数値 37 に変換される
isNaN("37.37"); // false: "37.37" は非数でない数値 37.37 に変換される
isNaN("37,5"); // true
isNaN("123ABC"); // true: Number("123ABC") の結果は非数
isNaN(""); // false: 空文字列は非数でない 0 に変換される
isNaN(" "); // false: 半角スペースからなる文字列は非数でない 0 に変換される

// 日付
isNaN(new Date()); // false: Date オブジェクトは数値(タイムスタンプ)に変換される
isNaN(new Date().toString()); // true: Date オブジェクトの文字列表現は数値として解釈できない

// 配列
isNaN([]); // false: プリミティブ表現は "" となり、数値 0 へ変換される
isNaN([1]); // false: プリミティブ表現は "1" となる
isNaN([1, 2]); // true: プリミティブ表現は "1,2" となり、数値として解釈できない

仕様書

仕様書
ECMAScript® 2027 Language Specification
# sec-isnan-number

ブラウザーの互換性

関連情報