aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/global_objects/isnan/index.html
blob: 41d9e3ba07d55dd41de40abe504f0dd272f382cf (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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
---
title: isNaN
slug: Web/JavaScript/Reference/Global_Objects/isNaN
tags:
  - Functions
  - JavaScript
  - Method
  - NeedsUpdate
  - Reference
translation_of: Web/JavaScript/Reference/Global_Objects/isNaN
---
<div>{{jsSidebar("Objects")}}</div>

<h2 id="Summary" name="Summary">Аннотация</h2>

<p>Функция <code><strong>isNaN()</strong></code> определяет является ли литерал или переменная нечисловым значением ({{jsxref("Global_Objects/NaN", "NaN")}}) или нет. При работе с функцией необходимо проявлять осторожность так как она <a href="#Description">имеет свои особенности</a>. В качестве альтернативы можно использовать метод {{jsxref("Number.isNaN()")}} из ECMAScript 6, или дополнительно проверять литерал или переменную на нечисловое значение при помощи <code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/typeof">typeof</a></code>.</p>

<h2 id="Syntax" name="Syntax">Синтаксис</h2>

<pre class="syntaxbox"><code>isNaN(<em>значение</em>)</code></pre>

<h3 id="Parameters" name="Parameters">Параметры</h3>

<dl>
 <dt><code>Значение</code></dt>
 <dd>Литерал или переменная которые будут проверяться на нечисловое значение.</dd>
</dl>

<h2 id="Description" name="Description">Описание</h2>

<h3 id="The_necessity_of_an_isNaN_function" name="The_necessity_of_an_isNaN_function">Для чего нужна функция <code>isNaN</code>?</h3>

<p>В отличие от других возможных значениях в JavaScript, при работе с значением данного типа невозможно полагаться на == и === для определения, является ли переменная или литерал нечисловым значением ({{jsxref("Global_Objects/NaN", "NaN")}}) или нет, так как проверки <code>NaN == NaN</code> и <code>NaN === NaN</code> <em>в качестве значения вернут </em><code>false</code>. Следовательно, для проверки нужна функция <code>isNaN</code>.</p>

<h4 id="Примечание">Примечание:</h4>

<p>Для альтернативной проверки переменной на NaN без использования функции isNaN() можно воспользоваться конструкцией x !== x</p>

<pre class="syntaxbox"><code><strong>var</strong> x = NaN</code>

<code>x != x // true</code>
<code>x !== x // true</code>
</pre>

<h3 id="Origin_of_NaN_values" name="Origin_of_NaN_values">Генерация значения <code>NaN</code></h3>

<p>Значение <code>NaN</code> генерируются арифметическими операциями, результатом которых является <em>undefined</em> или <em>unrepresentable</em>. Такие условия не обязательно обозначают переполнение стека.<code> NaN</code> также может являться результатом попытки преобразования числа в строку, или значения, не имеющего эквивалента в простых числовых примитивах.</p>

<p>Например, деление нуля на нуль возвращает <code>NaN</code><em>но деление других чисел на 0 не возвращает NaN</em>.</p>

<pre class="syntaxbox"><code><strong>var</strong> x = NaN</code>

<code>x != x // true</code>
<code>x !== x // true</code>
</pre>

<h3 id="Особенности_поведения"><em>Особенности поведения</em></h3>

<p>С самых ранних версий функции <code>isNaN</code> её поведение для не числовых переменных или литералов было довольно-таки запутанным. Когда аргументом функции <code>isNaN</code> является переменная, тип которой не <a href="http://es5.github.com/#x8.5" title="http://es5.github.com/#x8.5">Number</a>, она преобразуется к типу <code>Number</code>. Полученное значение затем проверяется, является ли оно {{jsxref("Global_Objects/NaN", "NaN")}}. Таким образом для не числовых значений, которые можно преобразовать в числовой тип без не-NaN значения (в частности, пустая строка или логические примитивы, которые преобразуются в 0 или 1), возвращаемое значение "false" может быть полной неожиданностью; пустая строка преобразуется в  "not a number." Путаница связана с тем, что "not a number" имеет определённое значение, описанное в стандарте IEEE-794 чисел с плавающей точкой. Функцию стоит воспринимать в качестве ответа на вопрос, "Является ли это значение корректным числом по стандарту IEEE-794?"</p>

<p>В следующей версии ECMAScript (ES6) функция {{jsxref("Number.isNaN()")}} также присутствует. <code>Number.isNaN(x)</code> будет надёжным методом для проверки, содержит ли <code>x</code> значение <code>NaN</code> или нет. Даже с <code>Number.isNaN</code>, однако, результатом <code>NaN</code> остаётся точное числовое значение, а не просто "not a number".</p>

<h2 id="Examples" name="Examples">Пример</h2>

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

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

// strings
isNaN("37");      // false: "37" преобразуется в число 37 которое не NaN
isNaN("37.37");   // false: "37.37" преобразуется в число 37.37 которое не NaN
isNaN("");        // false: пустая строка преобразуется в 0 которое не NaN
isNaN(" ");       // false: строка с пробелом преобразуется в 0 которое не NaN
isNaN("37,5");    // true

// Даты
isNaN(new Date());                // false
isNaN(new Date().toString());     // true

// Пример почему использование isNaN не всегда уместно
isNaN("blabla")   // true: "blabla" преобразовано в число.
                  // При парсинге преобразуется в число при неудаче возвращает NaN
</pre>

<h2 id="Спецификация">Спецификация</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Спецификация</th>
   <th scope="col">Статус</th>
   <th scope="col">Комментарий</th>
  </tr>
  <tr>
   <td>ECMAScript 1st Edition.</td>
   <td>Standard</td>
   <td>Initial definition.</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-15.1.2.4', 'isNaN')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td> </td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-isnan-number', 'isNaN')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td> </td>
  </tr>
 </tbody>
</table>

<h2 id="Поддержка_браузерами">Поддержка браузерами</h2>

<p> </p>

<div class="hidden">
<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>
</div>

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

<p> </p>

<h2 id="See_also" name="See_also">См. также</h2>

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