blob: 32883442a8e3f1274c56409ecf7b2c329c9353eb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
---
title: NaN
slug: Web/JavaScript/Reference/Global_Objects/NaN
tags:
- JavaScript
- プロパティ
- リファレンス
browser-compat: javascript.builtins.NaN
translation_of: Web/JavaScript/Reference/Global_Objects/NaN
---
{{jsSidebar("Objects")}}
グローバルプロパティ **`NaN`** は非数 (Not-A-Number) を表す値です。
{{js_property_attributes(0,0,0)}}
{{EmbedInteractiveExample("pages/js/globalprops-nan.html")}}
## 解説
`NaN` は**グローバルオブジェクト**のプロパティです。言い換えれば、グローバルスコープにある変数です。
`NaN` の初期値は非数であり、 {{jsxref("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` かどうかを的確に判定するには {{jsxref("Number.isNaN()")}} か {{jsxref("Global_Objects/isNaN", "isNaN()")}} を使用してください。あるいは自己比較を実行しましょう。 `NaN` は、また `NaN` だけが、自身と同等ではないと比較評価されます。
```js
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` を返します。
```js
isNaN('hello world'); // true
Number.isNaN('hello world'); // false
```
同じ理由で、 `bigint` 値の場合は `isNaN()` ではエラーが発生しますが、 `Number.isNaN()` では発生しません。
```js
isNaN(1n); // TypeError: Conversion from 'BigInt' to 'number' is not allowed.
Number.isNaN(1n); // false
```
加えて、配列メソッドの中には `NaN` を見つけることができるもの、できないものがあります。
```js
let arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1 (false)
arr.includes(NaN); // true
arr.findIndex(n => Number.isNaN(n)); // 2
```
## 仕様書
{{Specifications}}
## ブラウザーの互換性
{{Compat}}
## 関連情報
- {{jsxref("Number.NaN")}}
- {{jsxref("Number.isNaN()")}}
- {{jsxref("isNaN", "isNaN()")}}
|