26 precedenze e associatività

finché in un’espressione è utilizzato un solo operatore, o più operatori uguali (6+3+5+9)  quasi tutto va per il verso giusto.

Intanto invito a pensare a mente 6 / 4  / 2 / 3 , qualche dubbio inizia a venire. Certamente quando abbiamo un mix di operatori, chi prendere prima per il calcolo è una questione da non sottovalutare. Qui entrano in gioco le precedenze .

Vediamo il caso più semplice

var r =0, s=100;
r = 3 + 5 * 4;

facile, ci siete abituati dall’elementari! 23

r = 2**5+2;
document.write(r+br); //34 o 128?

vince l’elevamento a potenza, rispetto alla somma quindi 34.

Ma voglio proprio il 128?

r = 2**(5+2); //34 o 128?
document.write(r+br);

Con l’operatore di raggruppamento imposto la precedenza

r = s + 3; 
(r = s) + 3;

nel primo r vale s + 3 . Nel secondo r è uguale ad s e aggiungo 3

associatività

Riproponendo un esempio visto nella lezione sugli operatori, quello dell’ operatore virgola

for (var i = 0, j = 9; i <= j; i++, j--)
{document.write(i + (j + " ") );}
document.write(br);

se togliamo le parentesi interne nel write, otteniamo un risultato completamente diverso

(i + j + " " )

otterrei ripetuto il numero 9 (i+j) e lo spazio, questo perché l’addio<ione parte a sommare da sinistra verso destra.

(i + (j + " ") )

in questo caso invece ( j + ” ” ) trasformo il numero j in stringa e aggiungo lo spazio, ottenendo la stringa 9. trasformo quindi la i in stringa e aggiungo l’altra . In questo esempio, quindi, non viene fatta una somma tra numeri, ma una concatenazione tra stringhe .

r = 100 / 20 / 5;
document.write(r+br);

La risposta è 1, ma questo è dato in base all’associatività dell’operatore, che consumerà prima 100 / 2 e poi 5 / 5.

La tabella completa delle priorità e delle associatività con tutti gli operatori la si può trovare qui .

Vediamo un esempio di associatività da destra a sinistra:

document.write(2**3**2);

elevamento a potenza, prima 3 alla seconda, 9 e poi 2 alla 9, risultato 512 e non 2 alla 3 e poi alla 2 = 64

if (!!true) //l'associatività da destra a sinistra è ok ...
{document.write("associo da destra a sinistra"+br);}

se l’operatore logico NOT non calcolasse da destra a sinistra, in questo caso cosa calcolerebbe ( ! ! ) ?

Invece prima calcola !true e poi nega ancora, quindi la frase verrà stampata.