Pillole di Javascript: tipi di dato

Spesso per spiegare il concetto di tipo di dato si ricorre all’esempio della frutta: quanto fanno due mele più due pere? — nella foto Caravaggio, “canestro di frutta”, 1599.

Javascript è un linguaggio debolmente tipizzato. Questo significa che una variabile non dichiara un tipo ben determinato, ma può essere valorizzata con un qualsiasi tipo di dato. Ad esempio nel seguente listato:

var a = 1;
a = "hello";
a = true;
a = new Date();

la variabile “a” viene prima inizializzata con un valore numerico, poi le viene assegnata una stringa, seguita da un booleano e infine un oggetto. Questo non significa che in Javascript non sia presente il concetto di tipo di dato. Anzi, per comprendere il funzionamento di alcuni costrutti fondamentali è necessario conoscere bene i tipi di dato disponibili e le loro caratteristiche.

In Javascript i tipi si dividono in due categorie: primitivi e oggetti.

Tipi primitivi:
 - string (lista di code-point Unicode codificati in UTF-16)
 - number (valori da 64-bit a doppia precisione in formato IEEE 754)
 - boolean (true/false)
 - null
 - undefined
 - Symbol
Tipi oggetto: Object, Function, Array

I tipi primitivi sono immutabili, eventuali funzioni che eseguono operazioni su di essi in realtà allocano una nuova variabile contente il risultato dell’elaborazione. I tipi Function e Array sono oggetti particolari.

E’ possibile ottenere un primitivo tramite un letterale:

var s = "hello" // letterale stringa
var b = true // letterale booleano
var n = 42 // letterale numerico

Per conoscere il tipo di una variabile (o anche di un letterale), si può usare l’operatore typeof, seguito dal letterale o dalla variabile di cui si vuole conoscere il tipo. L’operatore restituisce una stringa che descrive il tipo di dato.

typeof 42 // "number"
typeof "hello" // "string"
typeof new Boolean() // "object"
typeof true // "boolean"

I tipi null e undefined hanno un ruolo particolare. Il primo, “null”, è considerato un primitivo, ma l’operatore typeof lo classifica come object. Il tipo “undefined” invece è proprio un tipo a se stante:

typeof null // "object"
typeof undefined // "undefined"

Entrambi i tipi indicano l’assenza di un valore. La differenza sta soprattuto nel modo in cui sono usati. undefined è usato più a livello di sistema, in particolare:

  • come valore di ritorno delle funzioni che non ritornano espressamente un valore
  • come risultato di un riferimento ad una proprietà non esistente di un oggetto
  • come risultato di un riferimento ad un elemento non esistente di un array
  • come valore di default di una variabile dichiarata ma non inzializzata
  • come valore di default dei parametri non passati alla chiamata di una funzione

Invece il tipo null è principalmente usato dallo sviluppatore per segnalare l’assenza di un valore, ad esempio come valore di ritorno di una funzione.

E’ da notare anche il fatto che “null” è una keyword che funge da letterale. Invece “undefined” è in realtà una variabile globale di sola lettura presente nel global object. Infatti:

this.null = "abc";
console.log(this.null) // "abc"
this.undefined = "abc"; // non fa nulla perché la variabile è read only
console.log(this.undefined) // "undefined"
Precedente Pillole di Javascript: il punto e virgola Successivo Pillole di Javascript: i wrapper dei tipi primitivi