JavaScript/Number/NaN

カテゴリ:Book:JavaScript#Number/NaN%20

Number.NaN は、ECMAScript における Number オブジェクトのプロパティで、「Not-a-Number」(数値ではない)を表す特殊な値です。この値は、無効な数学演算や数値に変換できない値から生じる結果を表します[1]

構文

Number.NaN

Number.NaN の値は、グローバルの NaN と同じ値です。この値は IEEE 754 浮動小数点数の特殊な値であり、数値型ですが、実際の数値ではありません。

特性

Number.NaN には、以下のような特性があります:

  • 読み取り専用: このプロパティは変更できません(ECMAScript 仕様で定義されたとおり)。
  • データプロパティ: Number.NaN は値プロパティであり、メソッドではありません。
  • 同一性: NaN は自分自身を含む他のどの値とも等しくありません(NaN === NaNfalse を返します)。

基本的な使用法

以下のプログラムは、Number.NaN の基本的な使用法を示しています。

// Number.NaN の値を表示
console.log(Number.NaN); // NaN

// グローバルの NaN との比較
console.log(Number.NaN === NaN); // false

このプログラムでは、Number.NaN とグローバルの NaN が同じ値であることを示しています。

NaN の生成

以下のプログラムは、様々な方法で NaN が生成される例を示しています。

// 無効な数学演算
console.log(Math.sqrt(-1)); // NaN

// 数値に変換できない値
console.log(Number("Hello")); // NaN

// NaN を含む演算
console.log(5 + NaN); // NaN
console.log(10 * NaN); // NaN

// Number.NaN を使用した比較
console.log(Number.NaN === Number.NaN); // false
console.log(isNaN(Number.NaN)); // true

このプログラムでは、NaN が生成される様々な状況と、NaN の特殊な比較動作を示しています。

NaN の検出

以下のプログラムは、NaN 値を検出するための方法を示しています。

// NaN の検出方法

// 1. isNaN 関数の使用
console.log(isNaN(Number.NaN)); // true
console.log(isNaN("string")); // true(文字列は数値に変換できないため)

// 2. Number.isNaN メソッドの使用(より厳密)
console.log(Number.isNaN(Number.NaN)); // true
console.log(Number.isNaN("string")); // false(型変換を行わない)

// 3. 自己比較を利用した検出
const value = Math.sqrt(-1);
console.log(value !== value); // true(NaN だけが自分自身と等しくない)

このプログラムでは、NaN を検出するための複数の方法を比較しています。特に Number.isNaN() は、ES6 で導入されたより厳密な検出方法です。

数値演算における NaN

NaN は、数値演算において以下のような性質を持ちます:

  • 伝播性: NaN を含む演算の結果は通常 NaN になります。
  • 例外なし: NaN を生成する演算は JavaScript では例外をスローしません。
  • 比較不可能: NaN は、他のどの値とも等しくなく、大小関係も定義されていません。
// NaN の伝播
console.log(5 + Number.NaN); // NaN
console.log(10 / 0 * NaN); // NaN

// 比較演算
console.log(Number.NaN < 1); // false
console.log(Number.NaN > 1); // false
console.log(Number.NaN >= Number.NaN); // false

グローバルの NaN との違い

Number.NaN とグローバルの NaN は以下の点で違いがあります:

  • アクセス: Number.NaNNumber オブジェクトのプロパティとしてアクセスします。
  • 変更可能性: ECMAScript 5 以降、グローバルの NaN は非厳格モードでは変更可能ですが、Number.NaN は読み取り専用です。
  • : 両者は同じ値を持ちます。
// グローバルの NaN は非厳格モードでは上書き可能
NaN = 5; // 非厳格モードでは成功するが効果はない
console.log(NaN); // NaN(上書きできない)

// Number.NaN は読み取り専用
// Number.NaN = 5; // TypeError: Cannot assign to read only property 'NaN' of function 'Number'

その他の Number オブジェクトの特殊値

ECMAScript は、Number オブジェクトに他の特殊な値も定義しています:

脚註

  1. Number.NaN はグローバルオブジェクトの NaN と同じ値を持ちますが、NumberNumber オブジェクトのプロパティとして提供されています。

外部リンク

カテゴリ:Book:JavaScript#Number/NaN%20 カテゴリ:JavaScript
カテゴリ:Book:JavaScript カテゴリ:JavaScript カテゴリ:Pages using the JsonConfig extension