Junior
Cosa succede in JavaScript durante un confronto non rigoroso (==)?
sobes.tech AI
Risposta dell'AI
Nel confronto non rigoroso (==) in JavaScript, viene eseguita una conversione di tipo (coercizione) degli operandi prima del confronto. Se i tipi degli operandi sono diversi, JavaScript tenta di convertire uno o entrambi gli operandi nello stesso tipo, basandosi su una serie di regole.
Regole principali di conversione con ==:
- Numero e stringa: La stringa viene convertita in numero. Se la conversione fallisce (NaN), il risultato è sempre
false.// "10" si converte in 10. Risultato: true console.log(10 == "10"); // "abc" si converte in NaN. Risultato: false console.log(10 == "abc"); - Booleano e non-Booleano: Il Booleano viene convertito in numero (
truein 1,falsein 0). Poi si confrontano il numero e l’altro operando (che può essere convertito).// true si converte in 1. Risultato: true console.log(true == 1); // false si converte in 0. Risultato: true console.log(false == 0); // false si converte in 0, "0" si converte in 0. Risultato: true console.log(false == "0"); - Null e Undefined:
nullè uguale aundefinedcometrue, e con nient’altro (eccetto se stesso) cometrue.// Risultato: true console.log(null == undefined); // Risultato: false console.log(null == 0); // Risultato: false console.log(undefined == 0); - Oggetto e primitivo: L’oggetto viene convertito in primitivo (usando
valueOfotoString), poi vengono confrontati i primitivi.// L’oggetto si converte in la stringa "10" (tramite toString()), poi si confronta con il numero 10 // "10" si converte in 10. Risultato: true console.log({ toString: () => "10" } == 10); - Simbolo e altro: I simboli possono essere confrontati solo con un altro simbolo o con un valore primitivo a cui il simbolo può essere convertito (cosa che di default è impossibile).
// Risultato: false console.log(Symbol('a') == 'a');
Il confronto non rigoroso può portare a risultati inaspettati a causa della conversione automatica dei tipi. Per un comportamento più prevedibile, si consiglia di usare il confronto rigoroso (===), che non esegue conversione di tipi e confronta direttamente gli operandi.