Publicação: 21/01/2019
Área:Desenvolvimento Web e Mobile
=, == e === operadores de igualdade em linguagens fracamente tipadas
Em matemática, estamos acostumados a utilizar o símbolo de igual (=) para um operador de igualdade. Assim, x = 5 tem o mesmo significado de 5 = x, e basicamente nos informa que naquela equação, o valor de x é 5.
Em linguagens de programação imperativas temos uma situaçao ligeiramente diferente, e que pode confundir quem está recém aprendendo a programar, pois a igualdade, na maioria das linguagens, não é representada pelo símbolo (=), mas sim pelos símbolos (==) e mesmo (===).
Assim sendo, temos um dos comandos mais simples de uma linguagem de programação, e que intuitivamente, o programador leigo pode entender incorretamente. Vejamos um exemplo:
x = 5;
Na grande maioria das linguagens, incluindo C, Java, Javascript e PHP, este comando está correto, mas ele não significa uma igualdade entre x e 5. Na verdade, ele representa uma atribuição. O comando pode melhor ser traduzido para o português como "x recebe o valor 5", ou mesmo "x passa, a partir deste comando, a ter o valor 5".
Em que isso é diferente da matemática? Trata-se de uma atribuição e não de uma igualdade, tanto que é também correto nestas linguagens escrevermos o comando:
x = x + 1;
Em matemática teríamos uma equação que estaria incorreta, mas em programação temos apenas um comando que diz que "x passa a receber o seu próprio valor acrescido de 1", ou seja, estamos apenas aumentando em 1 o valor de x.
Logo, temos que utilizar outro comando para indicar a igualdade entre dois valores, e, o padrão da maioria das linguagens, para diferenciar da atribuição, foi utilizar o comando (==).
Assim sendo, assumindo que o valor de x seja 5, teremos que o comando a seguir é uma comparação que retorna o valor falso:
x == 6;
enquanto que o comando a seguir, com x valendo 5, retorna verdadeiro:
x == 5;
Embora, em linguagens fortemente tipadas, temos apenas a necessidade de distinguir entre atribuição e comparação de igualdade, em linguagens fracamente tipadas, temos uma questão adicional, como veremos a seguir
Conversão automática de tipos em linguagens fracamente tipadas, e o comando ===
Em linguagens fracamente tipadas, o tipo de um determidado dado, por exemplo atribuído a uma variável, não é necessariamente fixo, e é convertido conforme necessário.
Por exemplo, podemos ter uma variavel stringx com o valor de uma string "5", e a variavel inteirox com o valor de um número inteiro 5, conforme o exemplo a seguir:
stringx = "5";
inteirox = 5;
A pergunta é, estas variáveis tem ou não tem o mesmo valor. E a resposta na verdade pode depender, em determinado momento, do que queremos que o programa faça. Em linguagens fortemente tipadas, a variável stringx precisaria primeiro ser criada como uma string, e a variável inteirox precisaria ser criada como um inteiro. De outro modo, haveria um erro quando tentássemos fazer estas atribuições.
Nestes casos, não é possível compararmos stringx e inteirox. Em linguagens fortemente tipadas, primeiro temos que converter o valor de uma das variáveis para inteiro ou string, para então compararmos com o valor da outra variável.
Já em linguagens como Javascript e PHP, o interpretador da linguagem busca converter o tipo das variáveis para o valor mais adequado. Assim, o comando a seguir retornará verdadeiro:
"5" == 5; //retorna verdadeiro
É justamente quando queremos que o comando de igualdade só retorne verdadeiro para tipos iguais, sem converter automaticamente entre um tipo e outro, que utilizamos "===".
Assim sendo, o comando a seguir retorna falso, pois faz uma comparação entre um valor string e outro inteiro, e o comando "===" impede que haja uma conversão de tipos automática antes da comparação:
"5" === 5; //retorna falso
(51) 3024-0730 - info@alfamidia.com.br - Porto Alegre/RS