javascript isNaNでの数値判定について

javascript isNaNでの数値判定について

javascriptで、isNaNでの数値判定を行うと、nullやtrue・falseなどが数値と判定されるため、使用すべきではないので、その実例を記述してます。

環境

  • OS windows10 pro 64bit
  • Apache 2.4.43
  • ブラウザ chrome 103.0.5060.134

数値判定

「isNaN」での数値判定を行うと「javascript」の仕様で「null」や「true・false」などが数値に変換されてしまうため、数値であると判定されてしまいます。

console.log(
  !isNaN('a') // false
);

console.log(
  !isNaN(1) // true
);

console.log(
  !isNaN(-1) // true
);

// nullは0扱い
console.log(
  !isNaN(null) // true
);

console.log(
  !isNaN(true) // true
);

console.log(
  !isNaN(false) // true
);

console.log(
  !isNaN(Number.MIN_VALUE) // true
);

console.log(
  !isNaN(Number.MAX_VALUE) // true
);

console.log(
  !isNaN('1') // true
);

正規表現を使用

数値判定を行う場合は、正規表現か「」を使用するのがおすすめです。

// + - 符号と小数点を含む数値判定
const regex = RegExp(/^[-+]?[0-9]+(\.[0-9]+)?$/);

console.log(
  regex.test(1) // true
);

console.log(
  regex.test(0.01) // true
);

console.log(
  regex.test(-1.11) // true
);

console.log(
  regex.test(0xFF) // true
);

console.log(
  regex.test(Number.MIN_VALUE) // false
);

console.log(
  regex.test(Number.MAX_VALUE) // false
);

console.log(
  regex.test(Number.MIN_SAFE_INTEGER) // true
);

console.log(
  regex.test(Number.MAX_SAFE_INTEGER) // true
);

console.log(
  regex.test(10n) // true
);

console.log(
  regex.test('1') // true
);

console.log(
  regex.test('-1.1') // true
);

console.log(
  regex.test('01') // true
);

console.log(
  regex.test(true) // false
);

console.log(
  regex.test(false) // false
);

console.log(
  regex.test('a') // false
);

console.log(
  regex.test([10]) // false
);

console.log(
  regex.test({a:1}) // false
);

console.log(
  regex.test(null) // false
);

console.log(
  regex.test(undefined) // false
);

console.log(
  regex.test(NaN) // false
);

console.log(
  regex.test(Infinity) // false
);

ただし、「文字列の数値」は「true」に、「Number.MAX_VALUE」と「Number.MIN_VALUE」などは「false」になります。

console.log(
  regex.test(Number.MIN_VALUE) // false
);

console.log(
  regex.test(Number.MAX_VALUE) // false
);

console.log(
  regex.test('1') // true
);

「isFinite」を使用すれば、これらは逆に判定されます。
※ただし、BIGINT型は「false」になります。

console.log(
  Number.isFinite(1) // true
);

console.log(
  Number.isFinite(0.01) // true
);

console.log(
  Number.isFinite(-1.11) // true
);

console.log(
  Number.isFinite(0xFF) // true
);

console.log(
  Number.isFinite(Number.MIN_VALUE) // true
);

console.log(
  Number.isFinite(Number.MAX_VALUE) // true
);

console.log(
  Number.isFinite(Number.MIN_SAFE_INTEGER) // true
);

console.log(
  Number.isFinite(Number.MAX_SAFE_INTEGER) // true
);

console.log(
  Number.isFinite(10n) // false
);

console.log(
  Number.isFinite('1') // false
);

console.log(
  Number.isFinite('-1.1') // false
);

console.log(
  Number.isFinite('01') // false
);

console.log(
  Number.isFinite(true) // false
);

console.log(
  Number.isFinite(false) // false
);

console.log(
  Number.isFinite('a') // false
);

console.log(
  Number.isFinite([10]) // false
);

console.log(
  Number.isFinite({a:1}) // false
);

console.log(
  Number.isFinite(null) // false
);

console.log(
  Number.isFinite(undefined) // false
);

console.log(
  Number.isFinite(NaN) // false
);

console.log(
  Number.isFinite(Infinity) // false
);