このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
NaN
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
グローバルプロパティNaN は非数 (Not-A-Number) を表す値です。
NaN のプロパティ属性 | |
|---|---|
| 書込可能 | 不可 |
| 列挙可能 | 不可 |
| 設定可能 | 不可 |
In this article
試してみましょう
function sanitize(x) { if (isNaN(x)) { return NaN; } return x;}console.log(sanitize("1"));// Expected output: "1"console.log(sanitize("NotANumber"));// Expected output: 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; // falseNumber.NaN === NaN; // falseisNaN(NaN); // trueisNaN(Number.NaN); // trueNumber.isNaN(NaN); // truefunction valueIsNaN(v) { return v !== v;}valueIsNaN(1); // falsevalueIsNaN(NaN); // truevalueIsNaN(Number.NaN); // trueただし、isNaN() とNumber.isNaN() には違いがあることに気をつけてください。前者は、値そのものがNaN であったり、値の変換の結果NaN になる場合にtrue を返します。後者は値そのものがNaN のときにだけtrue を返します。
isNaN("hello world"); // trueNumber.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); // truearr.findIndex((n) => Number.isNaN(n)); // 2仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-value-properties-of-the-global-object-nan> |