isNaN と Number.isNaN の違い — Number.isNaN(x) 推奨
JavaScript で「値が NaN (Not a Number) かどうか」を判定する方法は2つあります。
初心者が混乱しやすいのが isNaN と Number.isNaN の違いです。
基本の違い
| 関数 | 特徴 | 判定の対象 |
|---|---|---|
isNaN(x) | 数値に変換できるかどうかをチェックするため、文字列やオブジェクトも判定対象になる | 広すぎて誤判定が多い |
Number.isNaN(x) | 本当に NaN かどうかだけを判定する | 厳密で安全 |
コード例で比較
console.log(isNaN("abc")); // true (数値に変換できない → NaN扱い)
console.log(Number.isNaN("abc")); // false (文字列は NaN ではない)
console.log(isNaN(NaN)); // true
console.log(Number.isNaN(NaN)); // true
console.log(isNaN(undefined)); // true (数値にできない → NaN扱い)
console.log(Number.isNaN(undefined)); // false (undefined は NaN ではない)
JavaScriptisNaNは「数値に変換できないもの」も true にしてしまうNumber.isNaNは「値が NaN そのものか」を判定する
よく使うテンプレート集
安全な NaN 判定
let x = NaN;
if (Number.isNaN(x)) {
console.log("x は NaN です");
}
JavaScript入力チェック(文字列は除外)
function safeDivide(a, b) {
const result = a / b;
if (Number.isNaN(result)) {
console.log("計算できません");
return null;
}
return result;
}
console.log(safeDivide(10, 0)); // Infinity
console.log(safeDivide("abc", 2)); // null (NaN判定)
JavaScript配列の中から NaN を探す
const arr = [1, NaN, 2, "abc"];
const onlyNaN = arr.filter(Number.isNaN);
console.log(onlyNaN); // [NaN]
JavaScript例題: ユーザー入力の数値チェック
function parseNumber(input) {
const num = Number(input);
if (Number.isNaN(num)) {
console.log("数値に変換できません:", input);
return null;
}
return num;
}
console.log(parseNumber("42")); // 42
console.log(parseNumber("abc")); // null
JavaScript- 効果:
Number.isNaNを使うことで「文字列が NaN かどうか」を誤判定せずに済む。
実務でのコツ
Number.isNaNを使うのが推奨 → 判定が厳密で安全。isNaNは古いコードで見かける → 文字列や undefined まで true になるので注意。- 数値変換チェックには
Number.isNaN(Number(x))を使うと安心。 - 配列やデータ処理で NaN を除外するときに便利。
ありがちなハマりポイントと対策
isNaN("abc") === trueに驚く:- 対策:
Number.isNaN("abc")を使う。
- 対策:
undefinedやnullが NaN 扱いされる:- 対策:
Number.isNaNで厳密判定。
- 対策:
練習問題(NaNを除外して平均を計算)
function average(arr) {
const valid = arr.filter(x => !Number.isNaN(x));
const sum = valid.reduce((a, b) => a + b, 0);
return sum / valid.length;
}
console.log(average([10, NaN, 20, 30])); // → 20
JavaScript- 効果:
NaNを除外して正しい平均を計算できる。
直感的な指針
isNaN= 広すぎる判定(数値にできないものも true)。Number.isNaN= 本当に NaN かどうかだけ判定。- 実務では
Number.isNaNを使うのが安全。
これを覚えれば「入力チェック」「計算結果の判定」「データ処理」で NaN を正しく扱えるようになります。
