Programmazione

?? 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.

Staff RSWT 4 min di lettura

?? non è ||
In questa guida (5)
  1. 1Lo zero che resta
  2. 2Il SyntaxError
  3. 3Il lato destro che non parte
  4. 4Errori da evitare
  5. 5In sintesi

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 destraQualunque falsySolo null o undefined
0count || 42 stampa 420 ?? 42 ha output atteso 0
Stringa vuotatext || "hi!" stampa "hi!"Resta ""
Accanto all’altro, senza parentesiSyntaxError, negli esempi della paginaStesso errore
Lato destroLa sezione sul corto circuito lo mette insieme a ANDNon valutato se a sinistra non c’è null né undefined
Sui browser, baselineNon è la riga di questa paginaDa 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 marca SyntaxError.

  • Credere che false ?? c() chiami c(). Nell’esempio, b() restituisce false e 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.

Domande frequenti

L’output atteso scritto in pagina è 0. Invece count || 42, con count a 0, stampa 42.
No. La pagina dice che resta "", perché non è null né undefined. Con ||, text || "hi!" stampa "hi!".
Non direttamente. null || undefined ?? "foo" è, sulla pagina, un SyntaxError. Con le parentesi, (null || undefined) ?? "foo" restituisce "foo".
Nell’esempio no. b() restituisce false, e il lato destro non viene valutato. Se a sinistra c’è undefined, il destro parte.
No. Ho letto la pagina MDN il 31 ottobre 2026. La baseline indicata è luglio 2020.

Potrebbe interessarti anche...