?? non è ||
Il 31 ottobre 2026 MDN tratta ?? come un caso speciale di ||. Il primo cede solo su null e undefined. Il secondo cede su ogni falsy, zero compreso. Senza parentesi, i due operatori insieme sono un SyntaxError.
In questa guida (5)
Il 31 ottobre 2026 ?? non è ||. Il primo restituisce il lato destro solo se il sinistro è null o undefined. Il secondo lo restituisce per qualunque valore falsy. Ho letto la pagina MDN sull’operatore. Non ho eseguito gli esempi.
In breve: 0 ?? 42, nell’esempio, resta 0. count || 42, con count a 0, stampa 42. Mischiare || o && con ?? senza parentesi è un SyntaxError. Un’altra coppia di nomi che non coincidono, su un argomento diverso, è il pezzo su JSON mode e structured outputs. Questo operatore sta nel cluster Programmazione.
Lo zero che resta
La pagina Nullish coalescing operator lo presenta come operatore logico: restituisce l’operando destro quando il sinistro è null o undefined, altrimenti restituisce il sinistro. Baseline: disponibile sui browser da luglio 2020.
La descrizione lo chiama un caso speciale dell’OR logico (||). || restituisce il destro se il sinistro è un qualsiasi valore falsy, non solo null o undefined. Gli esempi di falsy che la pagina considera utilizzabili sono '' e 0.
In cima, due righe. null ?? "default string" ha come output atteso "default string". 0 ?? 42 ha come output atteso 0. Più sotto: stringa vuota con ?? resta "", perché non è null né undefined. 42 ?? 0 resta 42.
Il paragrafo sul valore di default ricorda il vecchio schema foo || "Hello!". || è un operatore logico booleano: il sinistro viene forzato a booleano, e un falsy — la pagina elenca 0, '', NaN, false — non viene restituito. Con count = 0, count || 42 stampa 42 e non 0. Con text = "", text || "hi!" stampa "hi!" e non la stringa vuota. ??, scrive la pagina, evita quel trabocchetto.
Il SyntaxError
La precedenza: ?? è al quint’ultimo posto, subito sotto || e subito sopra l’operatore condizionale ternario. Non si può combinare direttamente && o || con ??. In quei casi la pagina dice che viene lanciato un SyntaxError.
null || undefined ?? "foo"; // raises a SyntaxError
true && undefined ?? "foo"; // raises a SyntaxError
(null || undefined) ?? "foo"; // returns "foo"Le parentesi, nell’ultimo esempio, sono il modo che la pagina indica per dire la precedenza.
Il lato destro che non parte
Come || e &&, il lato destro di ?? non viene valutato se il sinistro non è né null né undefined. La pagina lo mostra con tre funzioni. a() stampa "a was called" e restituisce undefined. b() stampa "b was called" e restituisce false. c() stampa "c was called" e restituisce "foo".
a() ?? c() registra prima "a was called", poi "c was called", poi "foo", perché a() ha restituito undefined e quindi entrambe le espressioni sono valutate. b() ?? c() registra "b was called" e poi false. c() non parte: false non è null e non è undefined.
| Pagina MDN, letta il 31 ottobre 2026 | || | ?? |
|---|---|---|
| Quando passa a destra | Qualunque falsy | Solo null o undefined |
| 0 | count || 42 stampa 42 | 0 ?? 42 ha output atteso 0 |
| Stringa vuota | text || "hi!" stampa "hi!" | Resta "" |
| Accanto all’altro, senza parentesi | SyntaxError, negli esempi della pagina | Stesso errore |
| Lato destro | La sezione sul corto circuito lo mette insieme a AND | Non valutato se a sinistra non c’è null né undefined |
| Sui browser, baseline | Non è la riga di questa pagina | Da luglio 2020 |
Errori da evitare
Usare
||per un default e aspettarsi che 0 o la stringa vuota restino. Gli esempi della pagina fanno il contrario.Scrivere
null || undefined ?? "foo"senza parentesi. La pagina lo marcaSyntaxError.Credere che
false ?? c()chiamic(). Nell’esempio,b()restituiscefalsee il destro non viene valutato.Scambiare la precedenza.
??sta sotto||e sopra il ternario, non allo stesso piano.Trattare luglio 2020 come la data di
||. Quella riga, sulla pagina, è del nullish.Confondere l’operatore con JSON mode. Sono due nomi diversi, in un altro pezzo.
In sintesi
Il 31 ottobre 2026 MDN separa ?? da || con esempi eseguibili che non ho eseguito. Lo zero e la stringa vuota restano a sinistra di ??. Con || la pagina li sostituisce. Senza parentesi, i due operatori insieme sono un errore di sintassi. Se a sinistra c’è false, la funzione a destra non parte.
Foto di copertina: Markus Spiske, «Code on computer monitor», Wikimedia Commons, CC0. Il file è un monitor con del codice. Non è l’operatore ?? e non è un SyntaxError.


