aboutsummaryrefslogtreecommitdiff
path: root/files/ja/web/javascript/reference/global_objects/isnan/index.html
blob: 7f0de4c76e529f36568f785a202498bc00b41380 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
---
title: isNaN()
slug: Web/JavaScript/Reference/Global_Objects/isNaN
tags:
  - JavaScript
  - Method
  - Reference
translation_of: Web/JavaScript/Reference/Global_Objects/isNaN
---
<div>{{jsSidebar("Objects")}}</div>

<p><code><strong>isNaN()</strong></code> 関数は引数が {{jsxref("NaN")}} (非数) かどうかを判定します。<code>isNaN</code> 関数の型強制は<a href="#Description">興味深いルール</a>を持つことに注意してください。値が非数かどうかを判定する代用方法として、ECMAScript 2015 で定義されている {{jsxref("Number.isNaN()")}} が使用できます。</p>

<div>{{EmbedInteractiveExample("pages/js/globalprops-isnan.html")}}</div>

<h2 id="Syntax" name="Syntax">構文</h2>

<pre class="syntaxbox notranslate">isNaN(<var>value</var>)</pre>

<h3 id="Parameters" name="Parameters">引数</h3>

<dl>
 <dt><code>value</code></dt>
 <dd>テストされる値。</dd>
</dl>

<h3 id="Return_value" name="Return_value">返値</h3>

<p>もし引数が {{jsxref("NaN")}} であるならば <strong><code>true</code></strong> を返し, そうでなければ <strong><code>false</code></strong> を返します。</p>

<h2 id="Description" name="Description">解説</h2>

<h3 id="The_necessity_of_an_isNaN_function" name="The_necessity_of_an_isNaN_function">isNaN 関数の必要性</h3>

<p>JavaScript にあるその他すべての値とは違い、ある数値が {{jsxref("NaN")}} であるかの判定に等値性評価演算子(== と ===)を使用することはできません。なぜなら <code>NaN == NaN</code><code>NaN === NaN</code> はどちらも <code>false</code> と評価されるからです。そこで、<code>isNaN</code> が必要となります。</p>

<h3 id="Origin_of_NaN_values" name="Origin_of_NaN_values">NaN 値の生成条件</h3>

<p><code>NaN</code> の値は算術演算の結果が<strong>未定義</strong><strong>表現不可能な</strong>値となった時に生成されます。こうした値が常にオーバーフロー状態を表現するわけではありません。<code>NaN</code> はプリミティブな数値が利用不可能といった、非数値を数値へと型強制した結果生成されることもあります。</p>

<p>例えば、ゼロをゼロ除算した場合の結果は <code>NaN</code> になりますが、その他の数をゼロ除算した場合は異なります。</p>

<h3 id="Confusing_special-case_behavior" name="Confusing_special-case_behavior">特殊な場合における厄介な動作</h3>

<p><code>isNaN</code> 関数の定義はごく初期のバージョン以降、数値ではない引数における振る舞いが分かりにくいものとなっていました。<code>isNaN</code> 関数の引数が<a href="http://es5.github.com/#x8.5" title="http://es5.github.com/#x8.5">数値型</a>ではない場合、その値はまず数へと型強制されます。その結果の値はその後 {{jsxref("NaN")}} かどうかがテストされます。このようにして、数値型に型強制される際に結果が NaN ではない数値となる非数値(とりわけ型強制されると 0 や 1 の値になる空文字列や真偽値プリミティブ)に対しては、予想外なことに "false" が返されます{{訳注("「NaN でない」という結果から「数値である」と誤って解釈されてしまう")}}。無論、例えば空文字列は「数ではありません」。この混乱は、"not a number" (数ではない)というこの用語が IEEE-754 浮動小数点数定義で表現された数において特別な意味があるという事実に起因しています。この関数は、「この値を数値型に型強制した場合、IEEE-754 における 'Not A Number' という値になりますか?」という質問に答えるものとして解釈すべきです。</p>

<p>ECMAScript 2015 では {{jsxref("Number.isNaN()")}} 関数が存在します。<code>Number.isNaN(x)</code><code>x</code><code>NaN</code> かどうかをテストする確実な方法です。しかしながら <code>Number.isNaN</code> においても、<code>NaN</code> の意味は単純ではない明確な数値的意味を持つ "not a number" のままです。<code>Number.isNaN</code> が利用できない場合、<code>x</code><code>NaN</code> かどうかを確実にテストする代わりの方法として <code>(x != x)</code> という式があります。この式の結果は信頼性のない <code>isNaN</code> が引き起こす誤検出の影響を受けません。</p>

<p><code>isNaN</code> に対する polyfill の一つの例は以下のようになります(この polyfill は <code>NaN</code> が自分自身と常に等しくならないという特徴を利用しています):</p>

<pre class="brush: js notranslate">var isNaN = function(value) {
    var n = Number(value);
    return n !== n;
};</pre>

<h2 id="Examples" name="Examples"></h2>

<pre class="brush: js notranslate">isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

isNaN(true);      // false
isNaN(null);      // false
isNaN(37);        // false

// strings
isNaN('37');      // false: "37" は非数でない数値 37 に変換される
isNaN('37.37');   // false: "37.37" は非数でない数値 37.37 に変換される
isNaN("37,5");    // true
isNaN('123ABC');  // true:  parseInt("123ABC") の結果は 123、しかし Number("123ABC") の結果は NaN
isNaN('');        // false: 空文字列は非数でない 0 に変換される
isNaN(' ');       // false: 半角スペースからなる文字列は非数でない 0 に変換される

// dates
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

// isNaN が信頼性に欠ける理由となる誤検出の例
isNaN('blabla');   // true: "blabla" が数値に変換される。
                   // 数値への変換が失敗し NaN が返される。
</pre>

<h3 id="Useful_special-case_behavior" name="Useful_special-case_behavior">特殊な場合における便利な動作</h3>

<p><code>isNaN()</code> のふるまいを考慮した別の使用方法があります。<code>isNaN(x)</code><code>false</code> を返す場合、<code>NaN</code> を返すことなく算術式内で <code>x</code> を使用できます。<code>true</code> を返す場合、<code>x</code> を使用すると全ての算術式で <code>NaN</code> を返すことになります。これはつまり、JavaScript において <code>isNaN(x) == true</code> という式は、<code>x - 0</code> という式が <code>NaN</code> を返すかどうか、というケースと同等である(JavaScript では <code>x - 0 == NaN</code> は常に false を返すため、このことを確認できませんが)ということです。実際、<code>isNaN(x)</code><code>isNaN(x - 0)</code><code>isNaN(Number(x))</code><code>Number.isNaN(x - 0)</code>、そして <code>Number.isNaN(Number(x))</code> は常に同じ値を返し、JavaScript では <code>isNaN(x)</code> がこれらの条件を表す最も短い形式となります。</p>

<p>例えばこの動作を使って、ある関数への引数が算術処理可能か(数値として利用できるか)どうかをテストするのに利用し、そうでない場合はデフォルト値などを与えるようにできます。この方法によりコンテキスト次第で値を暗黙的に変換する汎用性の高い JavaScript 関数を作成できます。</p>

<h2 id="Specifications" name="Specifications">仕様書</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">仕様書</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-isnan-number', 'isNaN')}}</td>
  </tr>
 </tbody>
</table>

<h2 id="Browser_compatibility" name="Browser_compatibility">ブラウザーの互換性</h2>

<div class="hidden">このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 <a class="external" href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> をチェックアウトしてプルリクエストを送信してください。</div>

<p>{{Compat("javascript.builtins.isNaN")}}</p>

<h2 id="See_also" name="See_also">関連情報</h2>

<ul>
 <li>{{jsxref("NaN")}}</li>
 <li>{{jsxref("Number.isNaN()")}}</li>
</ul>