PROGRAMMIAMO
JS - Conversioni di tipo
Variabili non tipizzate

In JS le variabili non hanno tipo. Possono cioè contenere indifferentemente:

Qui sotto vengono forniti alcuni esempi:

var num = - 20, num2 = 3.14;

nome = "mario"; //oppure nome = 'mario';

//in questo caso è obbligatorio usare i doppi apici (perché?)
paese = "Stati Uniti d'America";

completato = true;

Non essendo tipizzate, in un certo senso il tipo di una variabile viene determinato al momento dell'assegnazione (si dice che JS è un linguaggio tipizzato dinamicamente):

var anno = 2004; //in questo caso anno è un numero
anno = "2004"; //qui invece anno è una stringa

Come si può vedere dall'esempio precedente, la stessa variabile può contenere dati di tipo differente nello stesso programma, sebbene questo stile di programmazione sia fortemente sconsigliato.

Conversione esplicita a intero

Dal momento che le variabili in JS non hanno tipo, le operazioni matematiche con decimali non vengono mai approssimate. Per esempio:

var numero = 7;
mezzo = numero/2;

Il valore di mezzo al termine del precedente calcolo è 3.5

Vi sono però casi in cui si desidera operare esplicitamente con valori interi. In questi casi sono utili le tre seguenti funzioni:

Per esempio:

numero = 10/3; // vale 3.33333
arrotonda = Math.round(numero); // vale 3
difetto = Math.floor(numero); // vale 3
eccesso = Math.ceil(numero); // vale 4

 

Operatori ambigui e conversioni implicite

Il problema dell'uso di variabili non tipizzate nasce dalla presenza di alcuni operatori che sono ambigui, in quanto hanno un significato diverso a seconda del tipo di oggetto a cui sono applicati. Si consideri a questo proposito la tabella seguente:

Operatore Significato con le stringhe Significato con i valori numerici
+ Concatena (unisce) due stringhe fra loro Somma due numeri
< Minore: confronta l'ordine alfabetico Minore: confronta i valori numerici
> Maggiore: confronta l'ordine alfabetico Maggiore: confronta i valori numerici

Si confronti per esempio il funzionamento dell'operatore + nei due casi seguenti:

var1 = 12;
var2 = 3;
alert(var1 + var2);

var1 = "12";
var2 = "3";
alert(var1 + var2);

Nel primo caso viene effettuata la somma dei due numeri e dunque il risultato mostrato è 15. Nel secondo caso invece, vengono concatenate insieme le due stringhe e il risultato mostrato è 123.

In modo analogo si comportano gli operatori di confronto:

var1 = 12;
var2 = 3;
if (var1<var2)
    alert("var1 è minore di var2");
else
    alert("var1 è maggiore uguale a var2");

var1 = "12";
var2 = "3";
if (var1<var2)
    alert("var1 è minore di var2");
else
    alert("var1 è maggiore uguale a var2");

Nel secondo caso, contrariamente a quanto forse ci si potrebbe attendere, viene visualizzata la frase "var1 è minore di var2". Infatti se var1 e var2 contengono stringhe, il confronto avviene in base all'ordine alfabetico e 12 viene prima in ordine alfabetico di 3.

Quando in una stessa espressione sono presenti variabili di tipo stringa e di tipo numerico, il JS si comporta in modo abbastanza schizofrenico. Nel caso dell'operatore +, se uno degli operandi è un numero e l'altro è una stringa, il JS converte il numero in una stringa e concatena tutto. Dunque:

var1 = "12";
var2 = 3;
alert(var1 + var2);

produce come risultato 123.

Invece con gli operatori di confronto, se sono presenti un numero e una stringa, il JS converte la stringa in un valore numerico. Pertanto:

var1 = "12";
var2 = 3;
if (var1<var2)
    alert("var1 è minore di var2");
else
    alert("var1 è maggiore uguale a var2");

visualizza che var1 è maggiore o uguale a var2.

La morale è che non conviene fidarsi di queste conversioni esplicite, poiché possono condurre facilmente ad errori e malfunzionamenti.

Un caso particolarmente rischioso è quello di un valore numerico acquisito tramite una casella di testo in un form. In questo caso il valore viene acquisito sempre come stringa. Si consideri l'esempio seguente:

var num1 = document.getElementById("val1").value;
var num2 = document.getElementById("val2").value;
alert(num1+num2)

In questo caso il risultato è la concatenazione dei due valori (anche se vengono inseriti valori numerici) e non la somma, poiché i valori vengono letti come stringhe dalle rispettive caselle di testo.

 

Conversione da stringa a numero: Number, parseFloat, parseInt

Ci sono molti casi in cui si vuole convertire una stringa in un valore numerico. Un caso molto frequente è quello appena discusso, in cui una casella di testo contiene dei valori numerici.

Ci sono tre funzioni per effettuare la conversione da stringa a numero. La più semplice è la funzione Number() che si usa in questo modo:

var num1 = document.getElementById("val1").value;
var num1_convertito = Number(num1);

o anche semplicemente così:

var num1 = Number(document.getElementById("val1").value);

Il significato dovrebbe essere abbastanza semplice: la stringa (o l'elemento contenente una stringa) posto fra le parentesi della funzione, viene trasformata in un valore numerico.

La funzione Number funziona bene nella maggior parte dei casi, convertendo sia valori interi sia valori decimali (col punto decimale). Esso gestisce anche il segno, convertendo dunque anche valori negativi.

Un metodo alternativo (scarsamente documentato) per effettuare la conversione da stringa a numero consiste nell'uso dell'operatore unario + prefisso alla stringa da convertire, per esempio:

var num1 = +document.getElementById("val1").value;

ATTENZIONE:

La cosa migliore da fare è convertire subito in valore numerico il contenuto delle caselle di testo e assegnarlo a una variabile (come mostrato negli esempi qui sopra). Da quel momento in poi il valore della variabile sarà trattato come numerico dal JS in tutte le espressioni in cui la variabile stessa è usata.

Ci sono alcuni casi particolari (stringhe contenenti caratteri oltre ai numeri o stringhe con valori numerici non in base 10) in cui la funzione Number non fornisce risultati corretti. In questi casi ci sono due altre funzioni più potenti e specifiche:

Normalmente l'uso di queste due funzioni non è necessario, dal momento che basta usare la funzione Number(). L'esempio che segue mostra un caso in cui parseInt() riesce ad effettuare la conversione, mentre Number() fallisce:

var trentini = "33 trentini entrarono a Trento";
var num = parseInt(trentini);
alert(num);

Alert visualizza in questo caso il valore numerico 33 (il resto della stringa, che contiene caratteri, non viene convertito). Come si vede si tratta di casi abbastanza particolari.

 

Conversione da numero a stringa

Meno frequente è il caso in cui si abbia un valore numerico e lo si voglia convertire esplicitamente in una stringa. In questo caso la funzione da usare si chiama String():

var anno = 2015;
var anno2 = String(anno);

In questo esempio la variabile anno2 contiene anno convertito in stringa di caratteri ("2015").

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it