JavaScript - Operator Precedence
Ciao a tutti, aspiranti programmatori! Oggi andremo a immergerci in un argomento che potrebbe sembrare un po' spaventoso all'inizio, ma vi prometto che non è così spaventoso come sembra. Stiamo parlando della precedenza degli operatori in JavaScript. Pensate a esso come la "scala gerarchica" per la matematica nella programmazione. Analizziamo insieme!
Cos'è la Precedenza degli Operatori?
Prima di tuffarci in profondità, iniziamo con le basi. La precedenza degli operatori è simile all'ordine delle operazioni che avete imparato nella lezione di matematica. Ricordate PEMDAS (Parentesi, Esponenti, Moltiplicazione, Divisione, Addizione, Sottrazione)? Beh, JavaScript ha la sua versione di questo!
La precedenza degli operatori determina come gli operatori vengono analizzati rispetto a elkaar. Gli operatori con una maggiore precedenza diventano operandi di operatori con una minore precedenza.
Analizziamo un esempio semplice:
let result = 5 + 3 * 2;
console.log(result); // Output: 11
Potreste pensare che la risposta dovrebbe essere 16 (5 + 3 = 8, poi 8 2 = 16), ma in realtà è 11. Perché? Perché la moltiplicazione ha una maggiore precedenza della somma. Quindi, 3 2 viene calcolato prima (dando 6), e poi 5 viene aggiunto a esso.
Associatività
Ora, parliamo di una parola complicata: associatività. Non preoccupatevi, è più semplice di quanto sembri!
L'associatività determina l'ordine in cui gli operatori della stessa precedenza vengono elaborati. Può essere da sinistra a destra o da destra a sinistra.
Associatività da Sinistra a Destra
La maggior parte degli operatori segue l'associatività da sinistra a destra. Questo significa che vengono valutati da sinistra a destra. Analizziamo un esempio:
let a = 10 - 5 - 2;
console.log(a); // Output: 3
Ecco come JavaScript elabora questo:
- 10 - 5 = 5
- 5 - 2 = 3
Associatività da Destra a Sinistra
Alcuni operatori, come l'operatore di assegnazione (=), hanno associatività da destra a sinistra. Vediamo come funziona:
let a, b, c;
a = b = c = 5;
console.log(a, b, c); // Output: 5 5 5
JavaScript elabora questo da destra a sinistra:
- c = 5
- b = c (che è 5)
- a = b (che è 5)
Tabella della Precedenza degli Operatori
Ora, diamo un'occhiata al "menu" delle precedenze degli operatori in JavaScript. Non preoccupatevi se non capite tutte queste ancora - esamineremo alcuni esempi!
Precedenza | Tipo di Operatore | Associatività | Operatori |
---|---|---|---|
19 | Gruppo | n/a | ( ... ) |
18 | Accesso al Membro | da sinistra a destra | . [] |
17 | Chiamata di Funzione | da sinistra a destra | ... ( ) |
16 | Nuovo (con elenco di argomenti) | n/a | new ... ( ) |
15 | Incremento/Decremento Postfix | n/a | ... ++ ... -- |
14 | NOT Logico, NOT Bitwise, Plus/Minus Unario, Incremento/Decremento Prefix, typeof, void, delete, await | da destra a sinistra | ! ~ + - ++ -- typeof void delete await |
13 | Esponenziazione | da destra a sinistra | ** |
12 | Moltiplicazione, Divisione, Resto | da sinistra a destra | * / % |
11 | Addizione, Sottrazione | da sinistra a destra | + - |
10 | Shift Bitwise | da sinistra a destra | << >> >>> |
9 | Relazionale | da sinistra a destra | < <= > >= in instanceof |
8 | Uguaglianza | da sinistra a destra | == != === !== |
7 | AND Bitwise | da sinistra a destra | & |
6 | XOR Bitwise | da sinistra a destra | ^ |
5 | OR Bitwise | da sinistra a destra | | |
4 | AND Logico | da sinistra a destra | && |
3 | OR Logico | da sinistra a destra | || |
2 | Condizionale | da destra a sinistra | ?: |
1 | Assegnazione | da destra a sinistra | = += -= *= /= %= <<= >>= >>>= &= ^= |= **= |
0 | Comma | da sinistra a destra | , |
Esempi
Ora, mettiamo questa conoscenza in pratica con alcuni esempi!
Esempio 1: Operazioni Aritmetiche
let result = 2 + 3 * 4 - 1;
console.log(result); // Output: 13
Ecco come JavaScript valuta questo:
- 3 * 4 = 12 (la moltiplicazione ha una maggiore precedenza)
- 2 + 12 = 14
- 14 - 1 = 13
Esempio 2: Operazioni Logiche
let x = 5;
let y = 10;
let z = 15;
let result = x < y && y < z || x > z;
console.log(result); // Output: true
Analizziamo questo:
- x < y è vero
- y < z è vero
- true && true è vero
- x > z è falso
- true || false è vero
Ricorda, && (AND) ha una maggiore precedenza di || (OR).
Esempio 3: Operazioni Miste
let a = 3;
let b = 4;
let c = 5;
let result = a + b * c > c * (a + b) && a < b;
console.log(result); // Output: false
Questo sembra complicato, ma analizziamo passo per passo:
- b * c = 20
- a + 20 = 23
- c (a + b) = 5 7 = 35
- 23 > 35 è falso
- a < b è vero
- false && true è falso
Esempio 4: Assegnazione e Confronto
let x, y, z;
x = y = z = 5;
console.log(x, y, z); // Output: 5 5 5
let result = x == y === z;
console.log(result); // Output: true
Ricorda, l'assegnazione (=) ha associatività da destra a sinistra, mentre le comparazioni di uguaglianza (==, ===) hanno associatività da sinistra a destra.
- z = 5
- y = z (che è 5)
- x = y (che è 5)
- x == y è vero
- true === z è vero (perché z è 5, che è truthy)
Conclusione
Complimenti! Avete appena fatto i primi passi per comprendere la precedenza degli operatori in JavaScript. Ricorda, la pratica fa perfezione. Non abbiate paura di sperimentare con diverse combinazioni di operatori - è così che davvero interiorizzerete questi concetti.
E un consiglio professionale: quando avete dubbi, usate le parentesi! Hanno la massima precedenza e possono rendere il vostro codice più leggibile. Per esempio:
let result = (2 + 3) * 4 - 1;
console.log(result); // Output: 19
In questo modo, state dicendo esplicitamente a JavaScript come volete che l'espressione venga valutata.
Continuate a programmare, continuate a imparare, e, soprattutto, divertitevi! JavaScript è un linguaggio potente, e comprendere questi fondamentali vi preparerà per il successo nel vostro viaggio di programmazione.
Credits: Image by storyset