Toda linguagem de programação possue vários tipos de comparadores de operações, porém no JavaScript existem dois que confundem bastante para quem está iniciando seus estudos nessa linguagem, nesse artigo o mistério entre esses dois operadores será desvendado e de bonus algumas dicas sobre como melhor utilizar os operadores de igualdade e igualdade estrita.
Introdução
JavaScript é uma linguagem de tipagem dinâmica. Isso significa que você não necessita declarar o tipo de uma variável antes de sua atribuição. O tipo será automaticamente determinado quando o programa for processado. Isso também significa que você pode reatribuir uma mesma variável com um tipo diferente.
Portanto, em alguns momentos durante o desenvolvimento de um software, será necessário, fazer uma comparação de igualdade entre valores e é ai que entra os operadores de igualdade e igualdade estrita.
Operador de igualdade: "=="
Esse operador gera um pouco de confusão quando um desenvolvedor percebe que a seguinte operação retorna True:
"1" == 1 // True
Mas o que acontece debaixo dos panos é bastante interessante. O operador de igualdade tenta realizar a conversão dos tipos se os tipos diferem e depois compara a igualdade, ou seja, um ou ambos dos valores são convertidos para um tipo comum. As regras de conversão são complexas e dependem dos tipos de argumentos. Para uma tabela de comparação completa, você pode acessar a documentação do MDN.
Nesse contexto, o que aconteceu no exemplo quando tentamos comparar a string "1" com um número, o primeiro argumento foi convertido para um tipo number.
"1" == 1 // Se torna ToNumber("1") === 1
Embora a comparação de string e number seja compreensível, as regras complexas para outros tipos conduzem a resultados ilógicos. Por exemplo, ver as comparações entre nulo, indefinido e falso:
false == undefined // false false == null // false null == undefined // true
Operador de igualdade estrita: "==="
Esse operador é o mais recomendado ao fazer checagem de igualdades, pois ele apenas retorna True se os dois argumentos forem do mesmo tipo.
Qual eu devo utilizar para cada situação?
Se usarmos o operador “==” em uma condição, saberemos que ela só será verdadeira se o valor da esquerda for o mesmo valor da direita, por exemplo:
if (true == “true”) // true if (10 == “10”) // true if (true == true) // true if (10 == 10) // true
Mas suponha que seja preciso fazer essa validação tendo certeza de que o número da direita é realmente um número, e não apenas possui o mesmo caractere. É nessa hora que utilizamos a igualdade estrita "===", comparando não apenas os valores mas também os seus tipos.
if (true === “true”) // false if (10 === “10”) // false if (true === true) // true if (10 === 10) // true
E assim como os operadores “==” e “===”, usamos a mesma lógica para os seus inversos “!=” e “!==”. Veja a seguir:
if (true != “true”) // false if (4 != “4”) // false if (true !== “true”) // true if (4 !== “4”) // true if (true !== true) // false if (4 !== 4) // false
Conclusão
Utilizar o operador de comparação de igualdade estrita em 99% das vezes será a melhor opção. Ao tentar comparar diferentes tipos com ele o resultado é sempre falso. Obterá os resultados que espera que não estejam sujeitos a regras de conversão difíceis de memorizar.
Note-se que estes operadores de comparação são para comparar tipos primitivos. Para comparar a igualdade profunda de objetos ou arrays é necessária uma abordagem diferente que compare os operandos estruturalmente. Qualquer dúvida, dicas ou sugestões, não se esqueça de deixar nos comentário aqui em baixo.
Espero que tenha curtido 🤟