NaN
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
グローバルプロパティ 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
またはundefined + undefined
) - 文字列が関わる加算以外の何らかの演算 (例えば
"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
同じ理由で、 bigint
値の場合は isNaN()
ではエラーが発生しますが、 Number.isNaN()
では発生しません。
isNaN(1n); // TypeError: Conversion from 'BigInt' to 'number' is not allowed.
Number.isNaN(1n); // false
加えて、配列メソッドの中には NaN
を見つけることができるもの、できないものがあります。
let arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1 (false)
arr.includes(NaN); // true
arr.findIndex((n) => Number.isNaN(n)); // 2
仕様書
Specification |
---|
ECMAScript Language Specification # sec-value-properties-of-the-global-object-nan |
ブラウザーの互換性
BCD tables only load in the browser