Pillole di Javascript: gli operatori

Nell’articolo precedente è spiegato il funzionamento degli operatori di confronto. In questo articolo sono approfonditi gli altri operatori di Javascript, in particolare riguardo il modo in cui convertono automaticamente i tipi di dato per poter eseguire il loro compito.

L’operatore binario “+” può essere usato sia per concatenare due stringhe che per sommare due numeri, e non va confuso con l’operatore unario “+”. Per prima cosa l’operatore converte eventuali operandi oggetto a primitivo numerico, ad eccezione di Date che viene convertito a stringa. Nella conversione non viene forzata la conversione al tipo numerico, ma viene usato il tipo ritornato dal metodo valueOf o toString (vedi conversione da oggetto a primitivo). Dopo la conversione entrambi gli operandi saranno primitivi. Se almeno uno è stringa, l’altro viene convertito a stringa, e concatenato al primo, altrimenti vengono entrambi convertiti a numerico e sommati.

L’operatore di sottrazione “-“ converte gli operandi a primitivi numerici, e ritorna la differenza tra i due valori.

Gli operatori unari positivo “+” e negativo “-“ convertono il loro operando a primitivo numerico. L’operatore “-” inverte il segno del numero risultante dalla conversione.

Gli operatori unari “++” e “–“ convertono il loro operando a primitivo numerico ed eseguono l’incremento o il decremento.

Gli operatori di confronto “>”, “<“, “>=” e “<=” convertono gli oggetti in primitivi numerici senza forzare la conversione di tipo. Se dopo la conversione gli operandi sono entrambi stringhe, vengono confrontate secondo l’ordine lessicografico, altrimenti gli operandi sono convertiti a numero e confrontati tra loro.

L’operatore logico and “&&” valuta prima l’operando a sinistra. Se questo è falsy, viene ritornato l’operando di sinistra come risultato del confronto, altrimenti viene valutato e ritornato l’operando di destra. La caratteristica interessante è il fatto che l’operatore non ritorna un valore booleano, ma l’operando stesso, di qualsiasi tipo esso sia. Questo è possibile perché in Javascript ogni valore, di qualsiasi tipo, può sempre essere considerato come booleano. I tipi considerati false sono detti “falsy”, mentre quelli considerati true sono detti “truthy”. Questa caratteristica dell’operatore può essere usata per testare la presenza di un oggetto prima di chiamare un suo metodo: “obj && obj.m()”.

L’operatore logico or “||” possiede la stessa caratteristica dell’operatore and, ma ritorna l’operando a sinistra se questo è truthy, altrimenti quello a destra. Un uso diffuso dell’operatore è la selezione di un valore di default da usare se il valore di inizializzazione di una variabile risultasse vuoto (quindi falsy). Ad esempio la riga:

var result = func (user_color ||  'white');

chiama la funzione “func”, passando come argomento la variabile user_color, che dovrebbe essere di tipo stringa. Se questa dovesse essere falsy (quindi null, undefined o stringa vuota) allora passa il valore di default “white”.

L’operatore not “!” converte il valore in booleano e lo inverte. Si può usare due volte per convertire in primitivo booleano un qualsiasi valore:

var stringa = "hello";
var booleano = ||stringa; // ritorna true, perché la stringa non è vuot

L’operatore “delete” elimina una proprietà da un oggetto oppure un elemento da un array. Non tutti gli elementi possono essere eliminati. L’operatore ritorna true se l’eliminazione è stata possibile, altrimenti false.

L’operatore “in” si aspetta un valore da convertire in stringa a sinistra, e un oggetto a destra. Ritorna true se l’oggetto contiene una proprietà (sua o ereditata) identificata dal nome a sinistra dell’operatore, anche se la proprietà ha valore undefined.

L’operatore “instanceof” si aspetta un oggetto a sinistra e una funzione costruttore a destra. Ritorna true se l’oggetto è un’istanza del costruttore. L’operatore considera anche le superclassi, quindi tutti gli oggetti sono considerati istanze di Object. Se il valore a sinistra non è un oggetto, ritorna sempre false. Se il valore di destra non è un costruttore, solleva TypeError.

L’operatore “typeof” ritorna una stringa che rappresenta il tipo di dato dell’operatore, che può essere “string”, “number”,  “undefined”, “boolean” oppure “object”. Notare che per null viene ritornato “object”, nonostante sia un tipo primitivo a se stante.

L’operatore “void” valuta l’espressione che lo segue, poi scarta il valore ottenuto e ritorna undefined. E’ utilizzato in HTML per eseguire del codice senza mostrare il suo valore di ritorno. Ad esempio:

<a href="javascript:void window.open();">Open New Window</a>

L’operatore virgola “,” valuta le espressioni alla sua sinistra e destra, e ritorna il valore dell’espressione più a destra. E’ usato nei cicli for: “for (var i=0, j=0; i<j; i++, j++)”.

Precedente Pillole di Javascript: operatori di confronto Successivo Pillole di Javascript: variabili