15.5 Tipi di dati primitivi null, undefined e boolean

iniziamo col parlare di 2 tipi di dati primitivi null e undefined e delle loro differenze.

Il null è un costrutto che rappresenta un’ assenza di contenuto o un oggetto privo di valore.

Esiste un  metodo per verificare il tipo di oggetto che dobbiamo considerare che si chiama typeof() .

null;
document.write(typeof(null));

Ci restituisce object, alcuni dicono che quest sia un bug di js, infatti se faccio imposto una variabile uguale null e chiedo se il tipo di quella variabile è diverso da null mi restituisce TRUE

let pippo = null;
document.write( typeof(pippo)!== null );

null è un costrutto letterale di js e non fa parte di nessun altro oggetto, nemmeno di quello globale window che corrisponde alla finestra del browser. Qualsiasi variabile che dichiariamo entra a far parte dell’oggetto globale window, null invece no.

undefined invece appartiene all’oggetto window, non può essere sovrascritta e rappresenta un oggetto con valore non definito

let cognome;

Questo è un esempio di variabile inizializzata con valore undefined, se visualizziamo il typeof() ci restituisce undefined. Spesso il null è identificato come undefined, infatti js se li confrontiamo ci risponde TRUE

document.write(null == undefined);

In realtà non sono dello stesso tipo, infatti se li confrontiamo con l’operatore strict ( === ) restituisce FALSE

document.write(null === undefined);

Infatti se scrivo

let cognome;
document.write(cognome);

mi restituisce undefined, ma se stampo invece

document.write(paperino);

ottengo un errore di variabile non definita e lo script si blocca.

Boolean

Vediamo le caratteristiche delle variabili BOOLEAN:

  • Possono avere solo due valori: TRUE e FALSE
  • Questi valori sono case sensitive: True è diverso da true e False è diverso da false
  • I seguenti valori sono considerati sempre false: false, null, undefined, 0, NaN, stringa vuota.
  • Tutti gli altri valori sono TRUe in una condizione booleana: anche new Boolean(false) è TRUE perchè è un oggetto
let mioValore = false;
let valoreDue = true;
document.write(mioValore);
document.write(valoreDue);

Ottengo ovviamente la stampa di FALSE e TRUE, ma se scrivo

let mioValore = False;
let valoreDue = True;
document.write(mioValore);
document.write(valoreDue);

ottengo un errore perchè js non li riconosce con la lettera iniziale maiuscola, invece scrivendoli come stringhe

let mioValore = "FALSE";
let valoreDue = "True";
document.write(mioValore);
document.write(valoreDue);

js li riconosce e li converte in booleani.

Esiste un oggetto predefinito, che è l’oggetto Boolean() che restituisce se un’espressione è vera o falsa.

var bool = Boolean(6>7);
document.write(bool);

la variabile bool odi tipo booleano, varrà false.

Posso creare un nuovo oggetto tramite Boolean

let bool1 = new Boolean("Hello");

ma non sarebbe un variabile di tipo primitivo booleano, infatti

let bool1 = new Boolean("Hello");
let bool2 = Boolean("Hello");
document.write(bool1===bool2);

ottengo FALSE perchè bool1 è un oggetto, mentre bool2 è un boolean (con l’operatore debole == otterrei TRUE perchè hanno lo stesso valore).

Per fare il casting in boolean di una variabile, basta mettere davanti al suo identificatore il doppio segno di negazione !!

let bool1 = 12;
let bool2 = !!bool;
document.write(typeof(bool1) );
document.write(typeof(bool2) );

mi restituisce bool1 come number, mentre bool2 come boolean. Non è consigliato invece fare il cast con new Boolean(), in quanto restituisce un oggetto e non un dato primitivo, infatti

let test = new Boolean(0);
if (test) {
    document.write("test è vero");
}

l’if restituisce TRUE, dovrei applicare la condizione al suo valore, tramite il metodo valueOf()

let test = new Boolean(0);
if (test.valueOf()) {
    document.write("test è vero");
}
else {document.write("test è falso");}

per ottenere la condizione falsa