![]() |
ES12 (ECMAScript 2021) ha introdotto diversi operatori che puntano a ridurre il codice boilerplate senza sacrificare la chiarezza. Tra questi, gli operatori di assegnazione logica (||=, &&=, ??=) risolvono un problema molto concreto: assegnare un valore solo se una certa condizione è soddisfatta, evitando blocchi if / else ripetitivi.
Per capire davvero questi operatori è fondamentale partire da una premessa:
👉 non introducono nuova logica, ma condensano pattern che usiamo da sempre.
Un concetto chiave: assegnazione condizionata
In JavaScript, prima dell’introduzione di questi operatori, l’unico modo per assegnare un valore in modo condizionale era scrivere qualcosa come:
if (condition) {
a = value;
}
Questo pattern è così comune che il linguaggio ha deciso di offrirne una forma sintattica dedicata,
più corta ma semanticamente equivalente.
È esattamente ciò che fanno ||=, &&= e ??=.
OR Assignment (||=)
Iniziamo dall’operatore più intuitivo, perché deriva direttamente dall’uso storico dell’operatore ||
per fornire valori di fallback.
Idea di base
L’operatore ||= assegna un valore solo se la variabile attuale è falsy.
Valori falsy in JavaScript
false0""nullundefinedNaN
In altre parole, stiamo dicendo a JavaScript:
“Se questo valore non è valido, sostituiscilo con un valore di default”.
Un primo esempio concreto
Immaginiamo di voler garantire che una variabile username abbia sempre un valore:
let username = "";
username ||= "Guest";
Per capire cosa succede, traduciamolo nella forma più esplicita possibile:
if (!username) {
username = "Guest";
}
Il comportamento è identico:
""è un valore falsy- quindi l’assegnazione avviene
L’operatore ||= non fa altro che rendere esplicita questa intenzione in una singola riga.
Quando ||= diventa pericoloso
Il problema nasce quando un valore falsy è semanticamente valido.
Consideriamo questo caso:
let counter = 0;
counter ||= 10;
A prima vista potrebbe sembrare corretto, ma traduciamolo con if:
if (!counter) {
counter = 10;
}
Qui il problema è evidente:
0è falsy- ma rappresenta un valore valido
👉 In questo scenario ||= non è l’operatore giusto.
AND Assignment (&&=)
Se ||= assegna quando qualcosa non è valido, &&= fa l’opposto:
assegna solo quando il valore attuale è valido (truthy).
Intuizione
&&= è utile quando vogliamo continuare una catena logica solo se una condizione iniziale è soddisfatta.
Esempio guidato
let isLogged = true;
isLogged &&= "utente autenticato";
Questo codice significa:
if (isLogged) {
isLogged = "utente autenticato";
}
L’assegnazione avviene solo perché isLoggedIn era truthy.
Se invece fosse stato false, il valore sarebbe rimasto invariato.
Perché è utile?
Pensiamo alla necessità di fare refresh di una cache:
let cachedValue = cache.get("result");
cachedValue &&= refreshCache("result");
Traduzione esplicita:
let cachedValue = cache.get("result");
if (cachedValue) {
cachedValue = refreshCache("result");
}
Analisi passo passo
cachedValueottiene il valore dalla cache.- Con
&&=diciamo: - “Se c’è già un valore (
cachedValueè truthy), aggiorniamo la cache.” - Se
cachedValueè falsy (nulloundefined), non facciamo nulla.
In questo modo:
- evitiamo errori e operazioni inutili
- evitiamo
if - rendiamo evidente che l’operazione è condizionata all’esistenza del valore
Nullish Assignment (??=)
Arriviamo ora all’operatore più importante e spesso frainteso.
Il problema che risolve
Molto spesso vogliamo assegnare un valore di default solo se una variabile non è stata inizializzata, non quando è semplicemente falsy.
Ed è qui che ||= fallisce.
Il comportamento di ??=
??= assegna un valore solo se la variabile è null o undefined.
Non guarda la truthiness, guarda l’assenza reale del valore.
Esempio chiarificatore
let pageSize = 0;
pageSize ??= 10;
Traduciamolo:
if (pageSize === null || pageSize === undefined) {
pageSize = 10;
}
Poiché pageSize è 0, l’assegnazione non avviene.
👉 Questo rende ??= la scelta corretta per:
- numeri
- booleani
- stringhe vuote
- configurazioni
Il grande limite di ?. in assegnazione
Arriviamo ora a un problema reale che molti incontrano.
Codice apparentemente logico, ma errato
user?.profile?.name = "Mario";
JavaScript lo rifiuta perché:
?.serve solo per leggere- non produce un riferimento scrivibile
In termini espliciti, JavaScript non permette questo:
if (user && user.profile) {
user.profile.name = "Mario";
}
La soluzione corretta: inizializzare prima
Il modo giusto per affrontare il problema è garantire l’esistenza della struttura, poi assegnare.
user.profile ||= {};
user.profile.name = "Mario";
Traduzione completa:
if (!user.profile) {
user.profile = {};
}
user.profile.name = "Mario";
Qui ||= non è solo una scorciatoia sintattica:
diventa uno strumento strutturale.
Pattern per oggetti annidati
Questo approccio scala molto bene:
user.settings ||= {};
user.settings.preferences ||= {};
user.settings.preferences.theme ??= "dark";
Ogni riga:
- prepara il terreno
- rende sicura la successiva
if/else sarebbe molto verbosa:if (!user.settings) {
user.settings = {};
}
if (!user.settings.preferences) {
user.settings.preferences = {};
}
if (user.settings.preferences.theme === null ||
user.settings.preferences.theme === undefined) {
user.settings.preferences.theme = "dark";
}
Conclusione
Gli operatori ||=, &&= e ??= non servono solo a “scrivere meno codice”, ma a
scrivere codice migliore:
- più leggibile
- più dichiarativo
- più vicino all’intenzione reale
Se usati insieme:
- eliminano il bisogno di
?.in scrittura - sostituiscono interi blocchi
if/else - diventano un pattern fondamentale del JavaScript moderno
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
