W3docs

Operatori di confronto in JavaScript

Gli operatori di confronto in JavaScript sono essenziali per prendere decisioni nel codice confrontando valori. Guida approfondita con esempi pratici.

Gli operatori di confronto in JavaScript sono essenziali per prendere decisioni nel codice confrontando valori. Questa guida approfondisce gli operatori di confronto di JavaScript, arricchita da esempi pratici, spiegazioni chiare e un'attenzione particolare ad alcuni comportamenti insoliti che possono verificarsi con certi tipi di dati.

Questa pagina tratta gli operatori relazionali (<, >, <=, >=), la differenza tra uguaglianza non stretta (==) e stretta (===), come la coercizione di tipo modifica il risultato e i casi limite riguardanti null, undefined, NaN e Object.is. Per l'elenco completo degli operatori JavaScript vedi Operatori JavaScript; per combinare i confronti vedi Operatori logici.

Introduzione agli operatori di confronto

Gli operatori di confronto confrontano due valori e restituiscono un valore Boolean (true o false) in base al risultato del confronto. In JavaScript esistono diversi operatori di confronto fondamentali:

  • == (Uguaglianza non stretta)
  • === (Uguaglianza stretta)
  • != (Disuguaglianza non stretta)
  • !== (Disuguaglianza stretta)
  • > (Maggiore di)
  • < (Minore di)
  • >= (Maggiore o uguale a)
  • <= (Minore o uguale a)

Ogni operatore ha un ruolo specifico e comprendere le differenze tra di essi è fondamentale per una programmazione accurata.

Confronto non stretto e stretto

La decisione più importante quando si confrontano valori è se permettere a JavaScript di convertire automaticamente i tipi. L'uguaglianza non stretta (==) converte gli operandi in un tipo comune prima di confrontarli; l'uguaglianza stretta (===) non lo fa.

Uguaglianza non stretta (==)

javascript— editable

Spiegazione: Qui 1 e "1" sembrano diversi (uno è un numero e l'altro è una string), ma == converte entrambi allo stesso tipo prima di confrontarli. Per questo vengono considerati uguali. Vedi la conversione di tipo per le regole esatte.

Uguaglianza stretta (===)

javascript— editable

Spiegazione: In questo caso 1 e "1" non sono considerati uguali perché === verifica che valore e tipo siano esattamente identici. In questo esempio i tipi sono diversi.

Operatori di disuguaglianza

Disuguaglianza non stretta (!=)

javascript— editable

Spiegazione: 1 e "2" sono diversi. Anche != converte i tipi prima di confrontare, ma poiché i valori risultano diversi dopo la conversione, restituisce true.

Disuguaglianza stretta (!==)

javascript— editable

Spiegazione: Qui !== trova i valori diversi perché confronta senza convertire il tipo. Poiché i tipi (numero vs. string) sono diversi, restituisce true.

Operatori relazionali

javascript— editable

Spiegazione: Questi esempi mostrano confronti di base:

  • x < y è true perché 5 è minore di 10.
  • x > y è false perché 5 non è maggiore di 10.
  • x <= 5 è true perché 5 è uguale a 5.
  • y >= 11 è false perché 10 non è maggiore o uguale a 11.

Nota sul confronto di stringhe: Quando < e > vengono usati con le stringhe, JavaScript le confronta in modo lessicografico (per valore Unicode). Ad esempio, 'b' > 'a' è true, ma '10' < '2' è anch'esso true perché il confronto avviene carattere per carattere.

Applicazioni pratiche degli operatori di confronto

Funzioni di ordinamento

javascript— editable

Spiegazione: Questo codice ordina i numeri in ordine crescente. La funzione sort confronta ogni coppia di numeri, disponendoli dal più piccolo al più grande.

Logica condizionale

javascript— editable

Spiegazione: Questo codice verifica se age è 18 o più. In caso affermativo, stampa "You are an adult." Altrimenti, stampa "You are not an adult."

I comportamenti insoliti di JavaScript

JavaScript mostra a volte comportamenti insoliti quando confronta tipi di dati particolari:

javascript— editable

Spiegazione:

  • [] == 0: Un array vuoto viene considerato uguale a zero perché, quando l'array viene convertito in numero, diventa 0.
  • [] == ![]: Questo sembra molto strano, ma ecco cosa succede: ![] converte l'array in un boolean (che è true perché gli array sono truthy), poi lo nega in false. Confrontando [] con false, entrambi vengono convertiti in numeri (0 e 0), quindi risultano "uguali".

Approfondiamo altri esempi di comportamenti insoliti di JavaScript nei confronti e in altre operazioni.

Confronto tra array e object

I controlli di uguaglianza non stretta di JavaScript possono produrre risultati inaspettati quando si confrontano array e object, a causa di come queste strutture dati vengono convertite e confrontate.

javascript— editable

Spiegazione:

  • [] == [] e {} == {}: Anche se entrambi i lati del confronto sembrano identici, sono istanze diverse in memoria. JavaScript verifica l'uguaglianza di object e array in base all'indirizzo di memoria, non al loro contenuto.
  • [] == ![]: Questo caso segue le stesse regole di coercizione spiegate nella sezione precedente.

Null vs. Undefined

Il confronto tra null e undefined con l'uguaglianza non stretta mostra anch'esso un comportamento insolito, ma condividono alcune similitudini in JavaScript.

javascript— editable

Spiegazione:

  • null == undefined: JavaScript tratta null e undefined come loosely equal, il che rappresenta un'eccezione nelle regole di uguaglianza non stretta.
  • null === undefined: Poiché sono tipi diversi, l'uguaglianza stretta restituisce false.
  • null == 0, null > 0 e null >= 0: Nei confronti relazionali, null viene coercito a 0, quindi null >= 0 diventa 0 >= 0, che risulta true. Tuttavia, null == 0 e null > 0 rimangono false perché null viene coercito a 0 solo nei contesti relazionali, non nell'uguaglianza non stretta.

Confronti tra boolean e valori non-boolean

Confrontare boolean con valori non-boolean usando l'uguaglianza non stretta può produrre risultati controintuitivi a causa della coercizione di tipo verso i numeri.

javascript— editable

Spiegazione:

  • true == 1 e false == 0: In JavaScript, true si converte in 1 e false in 0, quindi questi confronti restituiscono true.
  • true == 2: Poiché true si converte in 1, non è uguale a 2.
  • true == "1" e false == "0": Le stringhe vengono convertite in numeri, corrispondendo ai numeri in cui si convertono true e false.

Confronto con NaN

NaN ("Not a Number") è l'unico valore in JavaScript che non è uguale a sé stesso. Ogni confronto con NaN, incluso NaN === NaN, restituisce false. Usa Number.isNaN() (o Object.is) per verificarlo.

javascript— editable

Spiegazione: Poiché NaN risulta diverso da tutto (persino da sé stesso), non è possibile rilevarlo con == o ===. Number.isNaN() è il controllo affidabile.

Utilizzo di Object.is per i confronti

Per chi ha bisogno di confronti precisi, soprattutto con casi limite come NaN e +0 vs. -0, JavaScript fornisce Object.is.

javascript— editable

Spiegazione:

  • Object.is(NaN, NaN): A differenza degli operatori di uguaglianza, Object.is identifica correttamente due valori NaN come uguali.
  • Object.is(+0, -0): Object.is distingue tra zero positivo e zero negativo, cosa che gli operatori di uguaglianza non fanno.
  • Object.is(false, false): Dimostra l'uguaglianza esatta senza coercizione, restituendo true per valori primitivi identici.

Comprendere questi comportamenti insoliti di JavaScript non solo aiuta a evitare potenziali errori, ma migliora anche la capacità di eseguire il debug di problemi complessi in modo efficace.

Questi esempi illustrano perché è spesso più sicuro usare gli operatori di confronto stretto (=== e !==) che non convertono i tipi automaticamente. Questo aiuta a evitare risultati inattesi nel codice JavaScript.

Attenzione

Usa gli operatori di confronto stretto (=== e !==) in JavaScript per garantire l'accuratezza di tipo e valore. Questo previene la coercizione di tipo indesiderata, rendendo i confronti più prevedibili e affidabili. Ad esempio, 0 === '0' produce false, evidenziando l'importanza della corrispondenza dei tipi.

Riepilogo dei casi insoliti

Tieni a mente questi risultati sorprendenti. La maggior parte di essi scompare usando === e !==:

EspressioneRisultatoPerché
0 == ''trueEntrambi vengono coerciti al numero 0
0 == '0'trueLa string '0' viene coercita a 0
'' == '0'falseDue stringhe non-vuota/vuota, nessuna coercizione numerica
null == undefinedtrueRegola speciale nell'uguaglianza non stretta
null >= 0trueGli operatori relazionali coerciscono null a 0
null == 0falseL'uguaglianza non stretta non coercisce null a 0
NaN === NaNfalseNaN non è mai uguale a niente
[] == ![]true![] è false, poi entrambi vengono coerciti a 0
Object.is(NaN, NaN)trueObject.is tratta NaN come uguale a sé stesso
Object.is(+0, -0)falseObject.is distingue gli zeri con segno

Una regola pratica: ==/=== e !=/!== confrontano per (dis)uguaglianza, mentre <, >, <=, >= sono relazionali e coerciscono gli operandi in numeri (o confrontano le stringhe lessicograficamente). Gli operatori relazionali hanno precedenza maggiore rispetto agli operatori di uguaglianza, quindi a < b == c viene valutato come (a < b) == c.

Best practice

  • Preferire gli operatori stretti: Usa === e !== per evitare errori dovuti alla conversione automatica di tipo.
  • Condizioni chiare: Rendi le tue condizioni chiare e lineari, specialmente quando coinvolgono confronti.
  • Testare i casi limite: Verifica sempre i casi limite nei tuoi confronti, specialmente quando gestisci input utente o tipi di dati variabili.

Conclusione

Comprendere gli operatori di confronto in JavaScript è fondamentale per prendere decisioni corrette nei propri programmi. Seguendo queste linee guida e comprendendo sia i comportamenti tipici che quelli atipici, è possibile scrivere codice più affidabile e prevedibile. Continuando a esplorare JavaScript, usa questi operatori con giudizio per gestire efficacemente le varie sfide di programmazione.

Esercizi

Pratica
Quali dei seguenti operatori di confronto possono essere usati in JavaScript?
Quali dei seguenti operatori di confronto possono essere usati in JavaScript?
Was this page helpful?