NaN

グローバルプロパティ NaN非数 (Not-A-Number) を表す値です。

NaN のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能 不可

解説

NaNグローバルオブジェクトのプロパティです。言い換えれば、グローバルスコープにある変数です。

NaN の初期値は非数であり、Number.NaN の値と同等です。最近のブラウザーであれば、 NaN は設定、書き込みがともに不可能なプロパティとなっています。そうでない場合であっても、オーバーライドは無効となります。プログラムの中で NaN を使用するのは、むしろまれなことです。

NaN を返す演算には5種類があります。

  • 数値が解釈できない (例えば parseInt("blabla") または Number(undefined))
  • 結果が実数にならない数学演算 (例えば Math.sqrt(-1))
  • オペランドが NaN (例えば 7 ** NaN)
  • 不確定形 (例えば 0 * Infinity)
  • 文字列が関わる加算以外の何らかの演算 (例えば "foo" / 3)

NaN に対するテスト

NaN は別の NaN 値を含むあらゆる数と (==!====!== によって) 同じではないと比較されます。ある値が NaN かどうかを的確に判定するには Number.isNaN()isNaN() を使用してください。あるいは自己比較を実行しましょう。 NaN は、また NaN だけが、自身と同等ではないと比較評価されます。

NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true
Number.isNaN(NaN);  // true

function valueIsNaN(v) { return v !== v; }
valueIsNaN(1);          // false
valueIsNaN(NaN);        // true
valueIsNaN(Number.NaN); // true

ただし、 isNaN()Number.isNaN() には違いがあることに気をつけてください。前者は、値そのものが NaN であったり、値の変換の結果 NaN になる場合に true を返します。後者は値そのものが NaN のときにだけ true を返します。

isNaN('hello world');        // true
Number.isNaN('hello world'); // false

加えて、配列メソッドの中には NaN を見つけることができるもの、できないものがあります。

let arr = [2, 4, NaN, 12];
arr.indexOf(NaN);                      // -1 (false)
arr.includes(NaN);                     // true
arr.findIndex(n => Number.isNaN(n));   // 2

仕様書

仕様書
ECMAScript (ECMA-262)
NaN の定義

ブラウザーの互換性

BCD tables only load in the browser

関連情報