aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/global_objects/nan/index.md
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()")}}