Number.isNaN() vs isNaN(): TypeScriptでNaNを安全に判定

2024-05-16

TypeScriptで値がNaNかどうかを確認する方法

Number.isNaN()関数を使う

Number.isNaN()関数は、引数がNaNかどうかを厳密に判断します。これは、ES6で導入された新しい関数であり、より安全で信頼性の高い方法です。

function isNaNDemo(value: any): boolean {
  return Number.isNaN(value);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNDemo(num1)); // false
console.log(isNaNDemo(num2)); // true
console.log(isNaNDemo(str1)); // false

isNaN()関数は、引数が数値に変換できるかどうかを確認します。つまり、引数が数値以外の場合はtrueを返し、数値に変換できる場合はfalseを返します。ただし、この関数は引数を暗黙的に数値に変換してしまうため、誤った結果を返す可能性があります。

function isNaNLegacyDemo(value: any): boolean {
  return isNaN(value);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNLegacyDemo(num1)); // false
console.log(isNaNLegacyDemo(num2)); // true
console.log(isNaNLegacyDemo(str1)); // true **誤った結果**

一般的には、Number.isNaN()関数を使うことをお勧めします。これは、より安全で信頼性の高い方法であり、誤った結果を返す可能性が低いためです。

NaNとは何ですか?

NaNは "Not a Number" の略で、数値として認識できない値を表します。例えば、以下の操作の結果はNaNになります。

  • 0と0を割る
  • 文字列を数値に変換しようとする
  • Math.sqrt()などの数学関数に不正な引数を与える

TypeScriptで値がNaNかどうかを確認するには、主にNumber.isNaN()関数とisNaN()関数の2つの方法があります。より安全で信頼性の高い方法であるため、一般的にはNumber.isNaN()関数を使うことをお勧めします

その他のリソース




function isNaNDemo(value: any): boolean {
  if (typeof value !== "number") {
    return false;
  }
  return Number.isNaN(value);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNDemo(num1)); // false
console.log(isNaNDemo(num2)); // true
console.log(isNaNDemo(str1)); // false
function isNaNLegacyDemo(value: any): boolean {
  return isNaN(value);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNLegacyDemo(num1)); // false
console.log(isNaNLegacyDemo(num2)); // true
console.log(isNaNLegacyDemo(str1)); // true **誤った結果**

説明

  • isNaNDemo()関数とisNaNLegacyDemo()関数は、それぞれ引数がNaNかどうかを確認する関数です。
  • isNaNDemo()関数は、まず引数が数値かどうかを確認します。数値以外の場合は、falseを返します。数値の場合は、Number.isNaN()関数を使ってNaNかどうかを厳密に判断します。
  • isNaNLegacyDemo()関数は、引数を暗黙的に数値に変換しようとし、変換できる場合はfalseを返し、変換できない場合はtrueを返します。ただし、この関数は引数を暗黙的に数値に変換してしまうため、誤った結果を返す可能性があります。

実行結果

false
true
false

補足

  • このサンプルコードは、あくまでも例示であり、実際の用途に合わせて変更する必要があります。
  • TypeScriptには、NaN以外の値を確認するためのさまざまな関数があります。詳細は、TypeScriptのドキュメントを参照してください。



TypeScriptで値がNaNかどうかを確認するその他の方法

オブジェクトの型ガードを使う

TypeScript 4.1以降では、オブジェクトの型ガードを使用して、値がnumber型でかつNaNではないかどうかを確認することができます。

function isNumberAndNotNaN(value: any): value is number {
  return typeof value === 'number' && !Number.isNaN(value);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNumberAndNotNaN(num1)); // true
console.log(isNumberAndNotNaN(num2)); // false
console.log(isNumberAndNotNaN(str1)); // false

ES2020のObject.is()関数を使う

ES2020で導入されたObject.is()関数は、2つの値が同じオブジェクトであるかどうかを厳密に比較します。これは、NaNかどうかを判断するのにも使用できます。

function isNaNDemo(value: any): boolean {
  return Object.is(value, NaN);
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNDemo(num1)); // false
console.log(isNaNDemo(num2)); // true
console.log(isNaNDemo(str1)); // false

カスタム関数を使う

独自の関数を作成して、値がNaNかどうかを判断することもできます。この方法は、より柔軟な制御が必要な場合に役立ちます。

function isNaNDemo(value: any): boolean {
  if (typeof value !== 'number') {
    return false;
  }
  return value !== value; // NaNは自分自身と等しくない
}

const num1 = 10;
const num2 = NaN;
const str1 = "文字列";

console.log(isNaNDemo(num1)); // false
console.log(isNaNDemo(num2)); // true
console.log(isNaNDemo(str1)); // false
  • シンプルで安全な方法が必要な場合は、Number.isNaN()関数を使用するのがおすすめです。
  • オブジェクトの型ガードを使用する場合は、TypeScript 4.1以降を使用する必要があります。
  • Object.is()関数は、より厳密な比較が必要な場合に役立ちます。
  • カスタム関数は、より柔軟な制御が必要な場合に役立ちます。

typescript


TypeScriptでクラス情報を共有&ユーティリティ関数を提供!静的メソッドの定義と使い方を徹底解説

静的メソッドを定義するには、static キーワードをメソッド宣言の前に記述します。例えば、以下のコードは Person クラスに getNextId() という静的メソッドを定義します。静的メソッドには、以下の2つの方法でアクセスできます。...


BracketsでTypeScriptのジェネリック型パラメーターを操る!サンプルコードで理解を深める

ジェネリック型パラメーターは、クラスが特定の型を持つ値を操作することを示す型変数です。 これにより、クラスをさまざまな種類のデータに対して使用することが可能になり、コードの重複を削減し、コードの汎用性を高めることができます。角度括弧の使い方...


TypeScript コードの互換性を向上させる: downlevelIteration オプションの活用

ES6 以降で導入された新しいイテレータ構文は、古いブラウザではサポートされていません。downlevelIteration オプションを有効にすると、コンパイラはこれらの構文を古いブラウザでも動作するように書き換えます。downlevelIteration オプションを有効にすると、コンパイラはイテレータ構文をより効率的なコードに書き換えることができます。これは、特に古いブラウザでコードを実行する場合にパフォーマンスの向上につながる可能性があります。...


TypeScript、Firebase、Firestoreで発生する「TS2532: Object is possibly 'undefined'」エラーの解決方法

TypeScript、Firebase、Google Cloud Firestoreを使用する際に、TS2532: Object is possibly 'undefined'というエラーが発生することがあります。このエラーは、オブジェクトが未定義の可能性があることを示しています。...


「keyof typeof」を使いこなして、TypeScriptの型システムをマスターしよう

基本的な仕組み「keyof」:オブジェクトのプロパティ名を取得「typeof」:変数や型の型情報を取得**「keyof typeof」**は、これらの2つの演算子を組み合わせることで、オブジェクトの型情報からプロパティ名のみを取り出すことができます。...


SQL SQL SQL SQL Amazon で見る



TypeScriptでObject.definePropertyを使ってウィンドウオブジェクトに新しいプロパティを設定する

window オブジェクトに直接プロパティを追加するこれは最も単純な方法です。 以下のコードのように、ドット表記を使用して新しいプロパティを追加できます。この方法の利点は、シンプルで分かりやすいことです。 ただし、コードの可読性や保守性を考えると、あまり推奨されない方法です。


Proxy オブジェクトで動的なプロパティ割り当てをインターセプトする

この方法は、any 型を使用することで、型安全性なしで動的にプロパティを追加できます。しかし、型安全性がないため、誤ったプロパティ名や型を指定してしまう可能性があり、エラーが発生しやすくなります。この方法は、インターフェースを使用してオブジェクトの型を定義し、keyof 演算子を使用して動的にプロパティ名を取得します。


JavaScript開発者必見!TypeScriptでインターフェース型チェックを駆使して安全で高品質なコードを実現

このチュートリアルでは、TypeScriptにおけるインターフェース型チェックについて、分かりやすく説明します。インターフェースは、interface キーワードを使用して定義されます。インターフェースには、プロパティの名前、型、オプションでアクセス修飾子を含めることができます。


【TypeScript初心者でも安心】文字列を数値に変換する3つの方法と各方法の使い分け、さらに役立つ豆知識まで徹底解説

Number() 関数は、文字列を数値に変換する最も簡単な方法です。parseInt() 関数は、文字列を10進数の整数に変換します。各方法の注意点Number() 関数は、文字列の先頭から数値に変換できる部分のみを抽出します。そのため、文字列の末尾に文字が含まれている場合は、その部分は無視されます。


文字列列挙型:TypeScriptでコードの品質を向上させる

最も簡単な方法は、enum 型を使用する方法です。この例では、MyEnum という名前の列挙型を定義し、red、green、blue という3つの文字列リテラルをメンバーとして追加しています。const color: MyEnum = "red" という行では、color という名前の変数を MyEnum 型として宣言し、"red" という文字列リテラルを初期値として割り当てています。


TypeScript 開発を効率化する *.d.ts ファイル活用術

型情報の提供*.d.ts ファイルは、変数、関数、クラスなどの型情報を記述します。型情報を記述することで、コードの型安全性が高まり、開発時のエラーを減らすことができます。外部ライブラリの利用*.d.ts ファイルは、外部ライブラリの型情報を提供します。型情報が提供されているライブラリは、TypeScript コード内で型安全に利用することができます。


TypeScript初心者でも安心!nullとundefinedのチェックをマスターしよう

== nullを使用するこれは最も簡単な方法で、==演算子を使用して変数をnullと比較します。この方法は、nullとundefinedの両方をチェックするのに便利ですが、厳密な比較ではないことに注意が必要です。=== nullと=== undefinedを使用する


TypeScriptでオブジェクトの型を定義する:インターフェース、型エイリアス、クラス、型パラメーター、discriminated unions徹底解説

インターフェースは、オブジェクトの構造を定義するための型です。インターフェースには、オブジェクトが持つべきプロパティの名前と型を記述します。インターフェースは、オブジェクトの型チェックやコード補完などの機能を提供します。上記の例では、Personというインターフェースを定義しています。Personインターフェースは、nameという文字列型プロパティと、ageという数値型プロパティを持つオブジェクトを表します。


TypeScriptにおける ! 演算子:メンバー参照時の型安全性強化

従来のメンバー参照では、プロパティが存在しない可能性がある場合、コードが実行時にエラーになる可能性があります。! 演算子による型安全性強化! 演算子を使用すると、メンバーが存在しない可能性があっても、型安全なコードを書くことができます。! 演算子は、以下の条件を満たす場合にのみ使用できます。


TypeScriptで配列操作をマスターしよう!includes、find、indexOf、some、filterを使いこなす

includes メソッドは、配列内に指定された要素が存在するかどうかを調べ、存在する場合は true 、存在しない場合は false を返します。find メソッドは、配列内の要素を検索し、条件に一致する最初の要素を見つけた場合はその要素を返し、見つからなかった場合は undefined を返します。