JavaScript prevede cinque tipi di dato primitivi, numeri, stringhe, booleani, null
e undefined
, e un un tipo di dato complesso, gli oggetti.
Tutti gli altri elementi previsti dal linguaggio, come ad esempio gli array, le espressioni regolari, le funzioni, sono in realtà oggetti.
A dire il vero, anche i tipi di dato "primitivi" hanno degli oggetti corrispondenti con relative proprietà e metodi. JavaScript converte automaticamente un tipo primitivo nel corrispondente oggetto quando utilizziamo un suo metodo o una sua proprietà. Consideriamo ad esempio il seguente codice:
var nomeMaiuscolo = "Andrea".toUpperCase();
A partire dal tipo primitivo stringa, JavaScript crea il corrispondente oggetto String e invoca il metodo toUppercase()
per ottenere la versione in caratteri maiuscoli della stringa.
Questo contribuisce a creare non poca confusione nella distinzione tra dati primitivi e oggetti, tanto che non sono in pochi a semplificare sostenendo che in realtà in JavaScript tutto è oggetto.
In questa e nelle prossime lezioni ci occuperemo dei tipi di dato primitivi di JavaScript rimandando a quando acquisiremo le nozioni fondamentali sugli oggetti per approfondire la questione e vedere i principali metodi di gestione dei vari tipi di dato.
Stringhe in JavaScript
Una stringa in JavaScript è una sequenza di caratteri delimitata da doppi o singoli apici. Le seguenti sono esempi di stringhe:
"stringa numero uno"
'stringa numero due'
Non c'è una regola per stabilire quale delimitatore utilizzare. L'unica regola è che il delimitatore finale deve essere uguale al delimitatore iniziale. Questo ci consente di scrivere stringhe come le seguenti senza incorrere in errori:
"l'altro ieri"
"questa è una 'stringa'"
Un tipo speciale di stringa è la stringa vuota, cioè una stringa senza caratteri. Essa può essere rappresentata indifferentemente come ""
oppure ''
.
Per inserire caratteri speciali all'interno di una stringa si fa ricorso al carattere di escaping \
(backslash). Ad esempio, per inserire un ritorno a capo possiamo utilizzare la sequenza \n
, come mostrato nel seguente esempio:
"Ieri pioveva.\nOggi c'è il sole."
La stampa di questa stringa avrà il seguente risultato:
Ieri pioveva.
Oggi c'è il sole.
Tra i caratteri speciali che possiamo inserire tramite backslash c'è lo stesso backslash, come nel seguente esempio:
"La sequenza \\n indica il ritorno a capo"
Il primo backslash è il carattere di escaping mentre il secondo è il carattere da inserire nella stringa. Il risultato sarà quindi:
La sequenza \n indica il ritorno a capo
Questo meccanismo ci consente di inserire lo stesso delimitatore di stringa all'interno della stringa:
'l\'altro ieri'
"questa è una \"stringa\""
Il delimitatore preceduto dal backslash non verrà considerato come delimitatore ma come un normale carattere.
È anche possibile inserire caratteri Unicode in una stringa utilizzando la sequenza di escaping \u
seguita dal codice esadecimale del carattere. Ad esempio, la seguente stringa contiene al suo interno il carattere ©
:
"HTML.it\u00A9 2013"
Numeri in JavaScript
JavaScript ha un unico tipo di dato numerico, cioè non c'è distinzione formale, ad esempio, tra intero e decimale. Internamente tutti i valori numerici sono rappresentati come numeri in virgola mobile, ma se non è specificata la parte decimale il numero viene trattato come intero.
I seguenti sono esempi di rappresentazione di numeri interi:
var interoNegativo = -10;
var zero = 0;
var interoPositivo = 123;
Per rappresentato un numero non intero facciamo ricorso al punto come separatore della parte decimale:
var numeroDecimale = 0.52;
var altroNumeroDecimale = 12.34;
var decimaleNegativo = -1.2;
var decimaleZero = 1.0;
È possibile rappresentare i valori numerici secondo la notazione scientifica:
var primoNumero = 12e3; // equivalente a 12 x 103 cioè 12.000
var secondoNumero = 3.5e-4; // equivalente a 3.5 x 10-4 cioè 0,00035
Oltre alla classica notazione in base dieci, possiamo rappresentare i numeri in notazione ottale ed esadecimale:
var numeroOttale = 0123; //equivalente a 83
var numeroEsadecimale = 0x123; //equivalente a 291
Un numero ottale inizia con lo zero mentre un numero esadecimale inizia con zero e x (0x
).
L'insieme dei numeri rappresentabili in JavaScript cade nell'intervallo compreso tra -1.79769*10308
e 1.79769*10308
, con una precisione pari a 5*10-324
.
Ogni valore che va al di fuori dell'intervallo rappresentabile non genera un'eccezione ma viene rappresentato da due valori speciali:
- Infinity, detto anche infinito positivo,
- -Infinity, detto infinito negativo.
Ogni valore che ha una precisione maggiore di quella rappresentabile viene considerata uguale a zero.
Un altro valore numerico speciale è NaN, acronimo di Not a Number, che indica un valore numerico non definito. Nel seguente esempio il valore della variabile x dopo l'assegnamento è NaN
:
var x = x + 1;
I tipi di dato null, undefined e booleano
JavaScript prevede due tipi di dato speciali per rappresentare valori nulli e non definiti.
Il tipo di dato null prevede il solo valore null
, che rappresenta un valore che non rientra tra i tipi di dato del linguaggio, cioè non è un valore numerico valido, né una stringa, né un oggetto.
È possibile assegnare il valore null
ad una variabile come nel seguente esempio:
var x = null;
Da notare che il valore null
è diverso dal valore numerico 0 o dalla stringa vuota. Infatti, questi ultimi appartengono ai tipi numero e stringa, mentre null
è un tipo a se stante.
Il tipo di dato undefined rappresenta un valore che non esiste. Anche questo tipo di dato contiene un solo valore: undefined
. Questo è il valore di una variabile non inizializzata, a cui non è stato assegnato nessun valore, nemmeno null
.
Il tipo di dato booleano prevede due soli valori: true
(vero) e false
(falso).
Tipizzazione debole
JavaScript è un linguaggio a tipizzazione debole o dinamica. Ciò significa che quando dichiariamo una variabile, non ne specifichiamo il tipo di dato e che il tipo di dato che può contenere una variabile può cambiare durante l'esecuzione dello script.
Quando dichiariamo una variabile senza specificare un valore, a questa viene assegnato il valore undefined
. Il suo valore può cambiare tramite le nostre istruzioni ed assumere tipi di dato diversi, come nel seguente esempio:
var miaVariabile;
miaVariabile = 1;
miaVariabile = null;
miaVariabile = "uno";
miaVariabile = true;
L'assegnamento di un valore può comunque avvenire direttamente nella dichiarazione:
var miaVariabile = 0;