Pillole di Javascript: operatori di confronto

In Javascript esistono due operatori di confronto, l’operatore di confronto stretto “===” e l’operatore di confronto astratto “==”. Questi due operatori ritornano sempre un valore booleano: true se i due operandi sono considerati uguali, false altrimenti.

Per entrambi esiste la loro negazione: disuguaglianza stretta “!==” e disuguaglianza astratta “!=”, che seguono le stesse regola ma ritornano il valore booleano opposto.

L’operatore di confronto stretto considera diversi gli operandi di tipo diverso. Se invece gli operandi sono dello stesso tipo, viene confrontato il loro valore:

  • due stringhe sono uguali se hanno stessa lunghezza e stessi caratteri
  • due oggetti sono uguali se fanno riferimento allo stesso oggetto
  • due booleani sono uguali se rappresentano lo stesso valore booleano
  • eccetto NaN, due numeri sono uguali se hanno lo stesso valore (zero positivo e negativo sono considerati uguali)
  • NaN è considerato diverso da qualsiasi altro valore, anche da se stesso
  • null è uguale solo a se stesso
  • undefined è uguale solo a se stesso

I criteri di confronto stretto sono abbastanza intuitivi, l’unica eccezione è NaN, che è l’unico valore considerato diverso anche da se stesso. Possiamo utilizzare questa regola per riconoscere NaN:

var n = NaN;
var n_is_nan = !(n === n)

Un’altra nota va per gli oggetti. Se due variabili riferiscono lo stesso oggetto in memoria, allora sono considerate uguali. Se invece riferiscono due oggetti diversi, saranno considerate diverse, anche se i due oggetti sono identici:

var o1 = {x: 1, y: 1}
var o2 = {x: 1, y: 1}
console.log(o1 === o2); // stampa "false"

Come detto prima l’operatore di confronto stretto è utile solo per confrontare due valori dello stesso tipo, se vogliamo confrontare due tipo diversi è necessario eseguire una conversione esplicita. In alternativa si può utilizzare l’operatore di confronto astratto, che provvede automaticamente alla conversione dei tipi quando possibile.

L’operatore di confronto astratto applica le sue regole di conversione finché ottiene due operandi dello stesso tipo, che poi vengono confrontati con l’operatore di confronto stretto. Se i due operandi sono già dello stesso tipo, viene invocato direttamente l’operatore di confronto stretto.

Alcune combinazioni di tipi non possono essere convertite allo stesso tipo di dato, per cui il loro confronto ritorna sempre false. Infine fanno eccezione null e undefined, che sono considerati uguali anche se sono due tipi diversi.

L’algoritmo seguito dall’operatore di uguaglianza astratto è il seguente:

  • se i due operandi sono null e undefined, ritorna true
  • se i due operandi sono una stringa e un numero, converti la stringa in numero, ed esegui il confronto stretto
  • se uno degli operandi è booleano, convertilo in numero, e riesegui il confronto astratto
  • se uno degli operandi è un oggetto, convertilo in primitivo numerico, e riesegui il confronto astratto
  • qualsiasi altro caso ritorna false

In sintesi:

  • null e undefined sono uguali
  • i booleani e gli oggetti sono convertiti a numero
  • il caso stringa/numero converte la stringa in numero
Precedente Pillole di Javascript: conversione da oggetto a primitivo Successivo Pillole di Javascript: gli operatori