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.