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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
---
title: isNaN()
slug: Web/JavaScript/Reference/Global_Objects/isNaN
translation_of: Web/JavaScript/Reference/Global_Objects/isNaN
---
<div>
<div>
<div>{{jsSidebar("Objects")}}</div>
</div>
</div>
<h2 id="Summary" name="Summary">Sommario</h2>
<p>La funzione <strong><code>isNaN()</code></strong> determina se un valore è {{jsxref("NaN")}} o no.</p>
<div class="note">
<p><strong>Nota:</strong> le conversioni di tipo nella funzione <code>isNaN</code> seguono delle regole {{jsxref("Global_Objects/isNaN", "particolari", "#Description", 1)}}: alternativamente per determinare se un valore non è un numero si può usare la funzione {{jsxref("Number.isNaN()")}}, definito in ECMAScript 6, o l'operatore {{jsxref("Operators/typeof", "typeof")}}.</p>
</div>
<h2 id="Syntax" name="Syntax">Sintassi</h2>
<pre class="syntaxbox"><code>isNaN(<em>number</em>)</code></pre>
<h3 id="Parameters" name="Parameters">Parametri</h3>
<dl>
<dt><code>number</code></dt>
<dd>Il valore da controllare.</dd>
</dl>
<h2 id="Description" name="Description">Descrizione</h2>
<h3 id="The_necessity_of_an_isNaN_function" name="The_necessity_of_an_isNaN_function">La necessità di una funzione <code>isNaN()</code></h3>
<p>A differenza di tutti gli altri valori in JavaScript, non è possibile usare gli operatori di uguaglianza (<code>==</code> e <code>===</code>) per determinare se un valore è {{jsxref("NaN")}} oppure no, perché entrambe le uguaglianze <code>NaN == NaN</code> e <code>NaN === NaN</code> vengono considerate false. Ecco perché è necessaria una funzione <code>isNaN()</code>.</p>
<h3 id="Origin_of_NaN_values" name="Origin_of_NaN_values">L'origine del valore <code>NaN</code></h3>
<p>Il valore <code>NaN</code> è generato da un'operazione aritmetica il cui risultato è {{jsxref("undefined")}} o un valore <em>non rappresentabile</em>. Tali valori non rappresentano necessariamente un valore oltre i limiti. <code>NaN</code> può anche essere il risultato del trasformare valori non-numerici dai quali non è possibile ottenere un numero in numeri.</p>
<p>Per esempio, dividere zero per zero restituisce <font face="Consolas, Monaco, Andale Mono, monospace">NaN</font>, ma dividere un qualsiasi altro numero per zero no.</p>
<h3 id="Comportamenti_particolari">Comportamenti particolari</h3>
<p>Già dalla prima versione della specifica della funzione <code>isNaN</code>, il suo comportamento con valori non-numerici può confondere. Quando il parametro della funzione <code>isNaN</code> non è di tipo {{jsxref("Number")}}, questo viene prima trasformato in un numero. Il test per determinare se il parametro è {{jsxref("NaN")}} viene effettuato sul valore convertito. Quindi per i valori non-numerici che possono essere trasformati in un numero diverso da <code>NaN</code> la funzione restituisce <code>false</code>. La stringa vuota, per esempio, suciramente non è un numero, ma la funzione restituisce <code>false</code>. La confusione nasce dal fatto che il termine "not a number" (rappresentato da <code>NaN</code>) ha un significato per i numeri rappresentati come valori a virgola mobile IEEE-754. La funzione dovrebbe quindi essere interpretata come "È questo valore, quando convertito in un numero, un valore "Not a Number" secondo lo standard IEEE-754?"</p>
<p>La prossima versione di ECMAScript (ES6) definiesce la funzione {{jsxref("Number.isNaN()")}}. <code>Number.isNaN()</code>, che ritorna <code>false</code> per tutti i valori non-numerici, sarà un metodo affidabile per sapere se un numero è <code>NaN</code> o no. In assenza di <code>Number.isNaN</code>, l'espressione <code>(x !== x)</code> è il metodo più affidabile per determinare se un numero è <code>NaN</code> oppure no, perché evita i falsi positivi generati dalla funzione <code>isNaN()</code>.</p>
<h2 id="Examples" name="Examples">Esempi</h2>
<pre class="brush: js">var x = NaN;
isNaN(x); // true
Number.isNaN(x); // true
x !== x; // true
var x = undefined;
isNaN(x); // true, perché undefined viene convertito in NaN
Number.isNaN(x); // false
x !== x; // false
var x = {};
isNaN(x); // true, perché {} viene convertito in NaN
Number.isNaN(x); // false
x !== x; // false
isNaN(true); // false, perché true viene convertito in 1
isNaN(null); // false, perché null viene convertito in 0
isNaN(37); // false
// Stringhe
isNaN("37"); // false, perché "37" viene convertito in 37
isNaN("37.37"); // false, perché "37.37" viene convertito in 37.37
isNaN(""); // false, perché una stringa vuota viene convertita in 0
isNaN(" "); // false, perché una stringa con soli spazi viene convertita in 0
// !!! Ecco un esempio di falso positivo
var x = "37ab";
isNaN(x); // true, perché "37ab" viene convertito in NaN
Number.isNaN(x); // false
x !== x; // false
// Date
isNaN(new Date()); // false, perché una data che viene convertita in un
// numero ritorna un valore intero
var x = new Date().toString();
isNaN(x); // true, perché il metodo new Date().toString() restituisce una
// stringa alfanumerica, che viene convertita in NaN
Number.isNaN(x); // false
x !== x; // false</pre>
<h2 id="Specifiche">Specifiche</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Specifica</th>
<th scope="col">Stato</th>
<th scope="col">Commenti</th>
</tr>
<tr>
<td>ECMAScript 1st Edition.</td>
<td>Standard</td>
<td>Definizione iniziale.</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="Compatibilità_con_i_browser">Compatibilità con i browser</h2>
<p>{{ CompatibilityTable() }}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Funzionalità</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Supporto di base</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th><span style="font-family: open sans light,sans-serif; font-size: 16px; line-height: 16px;">Funzionalità</span></th>
<th>Android</th>
<th>Chrome for Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td><span style="font-size: 12px; line-height: 18px;">Supporto di base</span></td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
<td>{{ CompatVersionUnknown() }}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="See_also" name="See_also">Vedi anche</h2>
<ul>
<li>{{jsxref("NaN")}}</li>
<li>{{jsxref("Number.isNaN()")}}</li>
</ul>
|