TypeScript で NaN をチェックする方法
TypeScript で NaN (Not a Number) をチェックするには、主に次の 2 つの方法があります。
isNaN() 関数
function isNaNValue(value: number): boolean {
return isNaN(value);
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
Number.isNaN() メソッド
function isNaNValue(value: number): boolean {
return Number.isNaN(value);
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
どちらの方法を使うべきか?
一般的には、Number.isNaN()
を使うことを推奨します。なぜなら、isNaN()
は引数を数値に変換してからチェックするため、意図しない結果になる可能性があるからです。
例
console.log(isNaN("hello")); // true (文字列を数値に変換するため、NaN とみなされる)
console.log(Number.isNaN("hello")); // false (文字列は数値ではないため、NaN ではない)
重要な注意点
- NaN をチェックする際には、上記の 2 つの方法を使用してください。他の方法では、誤った結果になる可能性があります。
- NaN は数値型ですが、他の数値と等価ではありません。つまり、
NaN === NaN
はfalse
になります。
// 1. isNaN() 関数を使った例
function isNaNValue(value: number): boolean {
return isNaN(value);
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
解説
- isNaNValue 関数
この関数は、引数として受け取った数値value
が NaN かどうかをチェックします。 - isNaN(value)
この組み込み関数は、value
が NaN であるかどうかを判定します。 - num1 と num2
num1
は NaN の値を持ち、num2
は 10 の値を持ちます。 - console.log
それぞれの数値に対してisNaNValue
関数を呼び出し、その結果をコンソールに出力します。
// 2. Number.isNaN() メソッドを使った例
function isNaNValue(value: number): boolean {
return Number.isNaN(value);
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
比較によるチェック
NaN は自分自身と等しくないという特性を利用して、比較演算子を使ってチェックできます。
function isNaNValue(value: number): boolean {
return value !== value;
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
論理演算子によるチェック
NaN を他の数値と比較すると常に false
になるため、論理演算子を使ってチェックできます。
function isNaNValue(value: number): boolean {
return !(value > 0 || value < 0);
}
const num1: number = NaN;
const num2: number = 10;
console.log(isNaNValue(num1)); // true
console.log(isNaNValue(num2)); // false
注意
これらの代替方法は、isNaN()
や Number.isNaN()
と比較して、少し冗長で読みづらい場合があります。また、特定のブラウザや JavaScript エンジンの実装によっては、微妙な違いが生じる可能性があります。
typescript