2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Number.isNaNの否定で文字列が通る理由:isNaNとの違いをNode.jsで実測

2
Posted at

!Number.isNaN(value) は、数値の入力チェックとしては足りません。"abc" も null も通ります。number型の有限値だけを受け付けるなら、Number.isFinite(value) で確かめます。

2026年11月6日、macOS 27.2/Node.js v24.22.1で実行しました。ブラウザ・Windows・型検査は試していません。各例を .mjs に保存し、node ファイル名.mjs で実行できます。

NaNでないことと、数値であることは違う

const looksNumeric = value => !Number.isNaN(value);
console.log(looksNumeric("abc"), looksNumeric(null), looksNumeric(Infinity));
console.log(Number.isNaN(NaN), Number.isNaN("abc"));

出力:

true true true
true false

Number.isNaN が調べるのは「値がNaNそのものか」です。文字列やnullは変換しません。否定しても数値の保証にはなりません。ECMAScriptのNumber.isNaNの定義で確認できます。

グローバルのisNaNは変換してから調べる

for (const value of ["abc", "12", "", null, undefined, NaN]) {
  console.log(String(value), isNaN(value), Number.isNaN(value));
}

出力(左から表示用の値、isNaN、Number.isNaN):

abc true false
12 false false
 false false
null false false
undefined true false
NaN true true

3行目の先頭は空文字です。isNaN("abc") はtrueですが、isNaN("") や isNaN(null) はfalseでした。

グローバルのisNaNの定義には数値への変換が含まれます。名前の印象ではなく、変換も必要かを区別します。

number型の有限値だけを通す

for (const value of [12, 0, -2.5, "12", null, NaN, Infinity]) {
  console.log(String(value), Number.isFinite(value));
}

出力:

12 true
0 true
-2.5 true
12 false
null false
NaN false
Infinity false

数値12はtrue、文字列 "12" はfalseです。Number.isFiniteの定義は有限なNumber値を対象にしています。

整数限定・負数禁止・金額の上限は別の条件です。今回も-2.5はtrueなので、業務上の妥当性まで保証しません。

入力の約束をコードで示す

「数値型で、有限で、0以上」を受け付け、確認用に1を加える例です。

function acceptAmount(value) {
  if (!Number.isFinite(value) || value < 0) return "invalid";
  return value + 1;
}
console.log(acceptAmount(12), acceptAmount(0));
console.log(acceptAmount("12"), acceptAmount(-1), acceptAmount(Infinity));

出力:

13 1
invalid invalid invalid

文字列の "12" も拒否する設計です。フォームの文字列を扱う場合は、空欄と変換のルールを別途決めます。

AIが入力チェックを書いたら、数値文字列・空文字・null・NaN・Infinityも渡し、「何を拒否するか」を出力で確認します。


未経験者向けの体験版を公開しています

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?