Come controllare un numero in JavaScript

I numeri sono un tipo primitivo in JavaScript, ma il solo uso di typeof non differenzia i numeri da NaN o Infinity.

23 settembre, 2019 – 6 min read

Foto di Alex Chambers su Unsplash

È utile sapere come controllare se un valore è di tipo primitivo numero, dato che JavaScript è un linguaggio dinamicamente tipizzato.

Il modo più semplice per controllare un numero è usare typeof, che restituirà la stringa "number" per qualsiasi valore di tipo primitivo numero, incluso NaNInfinity, e -Infinity.

Un esempio in cui un numero potrebbe apparire come un altro tipo, indicando un bug nel mio codice, sarebbe nel parsing della valuta:

In questo caso, saprei che ho dimenticato di analizzare la stringa in un numero quando ottengo il valore di “string” da typeof.

Foto di Samuel Zeller su Unsplash

Se uso parseFloat() per controllare il valore della valuta, ma ho dimenticato di togliere il simbolo della valuta, ottengo un parse fallito e un risultato strano:

Oh, no. In questo caso, sembra che typeof non funzioni come mi aspettavo – perché i valori NaN sono considerati numeri in JavaScript.

Foto di Gemma Evans su Unsplash

Quando la parola chiave typeof restituisce “number”

Una soluzione ovvia per controllare il tipo primitivo number è usare la typeof parola chiave, come ho mostrato sopra.

Ma typeof è una soluzione incompleta, a causa di due valori speciali in JavaScript: NaN (“Not a Number”) e Infinity.

Per il mio esempio di valuta, so di avere un bug se il mio valore monetario è NaN o Infinity, ma typeof restituisce "number" per entrambi questi valori.

Forse il mio input è stato scritto usando un simbolo di valuta, e ho semplicemente cercato di usare parseFloat() per catturare il valore. Questo risulterebbe in NaN:

Foto di Timo Kaiser su Unsplash

Una funzione isNumber() personalizzata

Arobust, funzione personalizzata isNumber() userebbe typeof per controllare il tipo primitivo, controllare i valori NaN e controllare Infinity:

Oppure, nel caso in cui si è sicuri che NaN e Infinity non verranno fuori, sarebbe sufficiente controllare che typeof==="number".

Foto di 🇨🇭 Claudio Schwarz | @purzlbaum on Unsplash

La one-liner

Adoro i one-liner. Penso che debbano essere documentati con dei commenti, ma penso che siano davvero utili, non solo fantasiosi.

Ecco il one-liner per come controllare un numero in JavaScript:

Ma c’è un modo migliore per controllare un numero finito in JavaScript – la funzione helper Number.isFinite() ha lo stesso comportamento della funzione personalizzata isNumber() che ho scritto. Includo un esempio nella prossima sezione.

Foto di Bernard Hermant su Unsplash

Il modo più semplice per controllare un numero: Number.isFinite()

In realtà non è necessario scrivere funzioni personalizzate per controllare un numero, anche se è un modo istruttivo per ricordare che i valori JavaScript Infinity-Infinity, e NaN sono tutti del tipo primitivo numero.

“Il metodo Number.isFinite() determina se il valore passato è un numero finito.” – MDN Docs

Il metodo Number.isFinite() restituirà true per i numeri finiti, e false per Infinity-Infinity, e NaN – esattamente quello che vogliamo:

C’è anche la funzione globale isFinite(), che eseguirà la coercizione di tipo (come la coercizione di stringhe in numeri), come mostrato sopra.

Discuto questi metodi in profondità nel mio articolo su Infinity in The Startup:

Foto di Bogomil Mihaylov su Unsplash

Controlla se una variabile è un intero

Per controllare se la variabile A è un intero potrei usare l’operatore di uguaglianza libera == per vedere se il valore analizzato è uguale a se stesso.

Il seguente frammento di codice fornisce un esempio di come controllare un intero:

Utilizzando typeof si differenzierebbe una stringa che viene forzata in un numero da un numero reale, come farebbe l’operatore di uguaglianza rigorosa ===.

Foto di Markus Spiske su Unsplash

Strip out simboli di valuta

Per una migliore, funzione più robusta, potrei voler eliminare prima i simboli di valuta (come il segno del dollaro e tutte le virgole).

L’analisi completa del denaro usando le espressioni regolari in JavaScript va oltre lo scopo di questo articolo, ma questo codice rimuove $ e , prima dell’analisi:

Nota che le funzioni globali parseInt() e parseFloat() forzano i valori in stringhe, se necessario, e restituiranno NaN se la coercizione fallisce.

Ci sono anche le funzioni Numbers.parseInt() e Number.parseFloat(), che hanno lo stesso esatto comportamento.

Secondo i MDN Docs, queste funzioni duplicate sono state aggiunte a ECMAScript 2015 per la “modularizzazione degli scopi dei globali.”

Foto di Toa Heftiba su Unsplash

JavaScript ha effettivamente degli interi separati?

No, JavaScript ha solo un tipo di numero, che è rappresentato internamente come una rappresentazione in virgola mobile a 64 bit.

Quella virgola mobile è il tipo primitivo di dati numero, e c’è anche un tipo chiamato BigInt che può essere usato per numeri arbitrariamente grandi.

Le funzioni globali parseInt() e parseFloat() differiscono in ciò che si aspettano e che produrranno, ma non perché ci siano effettivamente tipi interi e in virgola mobile separati in JavaScript.

Foto di Volkan Olmez su Unsplash

Conclusione

Controllare un numero in JavaScript non è particolarmente complicato – typeof funziona sostanzialmente come dovrebbe, finché si è consapevoli che sia NaN che Infinity hanno il numero typeof.

Il modo più semplice per controllare un numero finito (cioè non NaN o Infinity) in JavaScript è usare Number.isFinite(), che non coerciziona i valori ai numeri, o il globale isFinite(), che esegue la coercizione di tipo.

Controllare la presenza di un intero in particolare comporta l’utilizzo della funzione parseInt(), seguita dal confronto del valore analizzato con se stesso utilizzando == (che coerciziona i valori non numerici, come le stringhe ai numeri) o === (che restituisce true solo se entrambi i valori sono numeri).

Sotto il cappuccio, interi e float sono tutti uguali: JavaScript ha solo un tipo di numero, il tipo primitivo number.

Foto di K. Mitch Hodge on Unsplash

Altra lettura

  • La funzione Number.isInteger() non costringe le stringhe a numeri:
  • Sumit Kumar Pradhan ha scritto sul controllo dei numeri su Dev.to:
  • Chris Ferdinandi ha discusso l’analisi dei numeri sul suo blog vanilla JS:
  • L’espressione regolare ^+(\.{1,2})?$ corrisponde al denaro:
  • Sarah Dayan ha scritto sull’analisi del denaro in JavaScript su frontstuff:

Foto di Alejandro Ortiz su Unsplash

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *