In JavaScript, i valori possono essere di tipi diversi. Il tipo di una variabile si può cambiare con una conversione di tipo esplicita. Oltre a questo, JavaScript esegue anche una coercizione di tipo (conversione implicita di tipo) quando il contesto lo richiede.
A differenza di molti altri linguaggi, JavaScript non ha un costrutto per eseguire il cast verso un tipo (diverso), ma si possono usare alcune funzioni ausiliarie predefinite.
In particolare, Boolean, Number e String si possono usare come funzioni per convertire un valore nel tipo corrispondente.
Con Boolean(value) puoi convertire qualsiasi valore in un valore booleano.
Esiste un insieme fisso di valori, i cosiddetti valori falsy, che si convertono in false.
Soprattutto, false, 0, la stringa vuota, null, undefined e NaN sono falsy.
Per tutti gli altri valori, Boolean restituisce true.
Questi valori si chiamano truthy.
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
Nota che, per le regole descritte, '0', 'false', [] e {} sono truthy in JavaScript.
Number(value) si può usare per convertire un valore in un numero.
Gli spazi bianchi all'inizio e alla fine di una stringa vengono ignorati e una stringa vuota viene convertita in 0.
Se provi a convertire un valore non primitivo o una stringa che non rappresenta un numero, il risultato è NaN (Not-A-Number).
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('');
// => 0
Number({ num: 123 });
// => NaN
Con String(value) puoi convertire un valore in una stringa.
Per i valori primitivi, il risultato è quello che ti aspetti.
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
Per gli array, la funzione String applica la conversione a stringa a ogni elemento e unisce i risultati con una virgola.
Puoi anche applicare il metodo join direttamente, ad esempio per personalizzare il separatore.
Nota che in questi casi null e undefined vengono convertiti in una stringa vuota.
String([42, null, true, 'abc']);
// => '42,,true,abc'
Per gli oggetti, per impostazione predefinita String restituisce un testo poco utile.
String({ key: 'value' });
// => '[object Object]'
In alcuni contesti, JavaScript converte automaticamente un valore in un altro tipo di dato prima di valutare un'istruzione. Questa conversione implicita si chiama coercizione di tipo.
Quando un valore non booleano viene usato in un contesto booleano, JavaScript applica le stesse regole della funzione Boolean per convertirlo implicitamente.
La coercizione a valore booleano si verifica comunemente nei casi seguenti:
?
!
&& e OR || (il risultato dell'espressione è uno degli operandi, non necessariamente un valore booleano)const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
Se l'operatore di addizione + viene usato con valori primitivi e un operando è una stringa, anche l'altro subirà una coercizione a stringa.
La logica di conversione è la stessa della funzione String.
Successivamente, le due stringhe vengono concatenate.
let name;
'hello ' + name;
// => 'hello undefined'
Molti operatori applicano una coercizione numerica agli operandi (se necessario) secondo la logica della funzione Number spiegata sopra.
+ (se non è coinvolta alcuna stringa), -, *, /, %, **
+, -
>, >=, <, <=
|, &, ^, ~
Per maggiori dettagli su uno qualsiasi di questi operatori, consulta l'elenco degli operatori di MDN.
Per evitare errori, è buona pratica chiamare sempre Number esplicitamente prima di applicare questi operatori.
Il tuo amico Kojo è un grande appassionato di numeri. Ha un piccolo sito web chiamato "fun-with-numbers". Kojo non è molto bravo a programmare, quindi ti ha chiesto aiuto.
Costruirai due funzioni ausiliarie per i nuovi giochi con i numeri sul sito di Kojo e una terza per convalidare l'input che un utente può inserire.
Uno dei giochi sul sito di Kojo assomiglia a una slot machine che mostra due gruppi di rotelle con delle cifre. Ogni gruppo di cifre rappresenta un numero. Per la meccanica del gioco, Kojo ha bisogno di conoscere la somma di quei due numeri.
Scrivi una funzione twoSum che accetta due array come parametri.
Ogni array è composto da uno o più numeri tra 0 e 9.
La funzione deve interpretare ogni array come un numero e restituire la somma di quei due numeri.
twoSum([1, 2, 3], [0, 7]);
//=> 130
// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130
Un altro gioco sul sito è un piccolo quiz chiamato "Lucky Numbers". Un utente può inserire un numero e poi vede se il numero appartiene a una qualche sequenza o schema segreto. La sequenza o lo schema dei "lucky numbers" cambia ogni mese e ogni utente ha solo un numero limitato di tentativi per indovinarlo.
I numeri fortunati di questo mese devono essere numeri palindromi. I numeri palindromi restano uguali quando si invertono le cifre.
Implementa la nuova funzione luckyNumber che accetta un numero come parametro.
La funzione deve restituire true se il numero è palindromo e false in caso contrario.
Il numero di input sarà sempre un numero intero positivo.
luckyNumber(1441);
//=> true
luckyNumber(123);
//=> false
In vari punti del sito ci sono campi di input dove gli utenti possono inserire numeri e fare clic su un pulsante per attivare qualche azione. Kojo vuole migliorare l'esperienza utente del suo sito. Vuole mostrare un messaggio di errore nel caso in cui l'utente faccia clic sul pulsante ma il campo contenga un valore di input non valido.
Ecco qualche informazione in più su come viene fornito il valore di un campo di input.
undefined o null.Scrivi una funzione errorMessage che accetta l'input dell'utente come parametro.
Se l'utente non ha fornito alcun input, errorMessage deve restituire 'Required field'.
Se l'input non rappresenta un numero diverso da zero (secondo le regole di conversione di JavaScript), deve essere restituito 'Must be a number besides 0'.
In tutti gli altri casi puoi assumere che l'input sia valido: il valore restituito deve essere una stringa vuota.
errorMessage('123');
// => ''
errorMessage('');
// => 'Required field'
errorMessage('abc');
// => 'Must be a number besides 0'
Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.