Como “20” e 20 são considerados iguais em JavaScript?
-
05-07-2019 - |
Pergunta
Entendo que usar o tipo de comparação "===", portanto, executar o código a seguir resulta em "diferente" porque está comparando um tipo de número a um tipo de string.
var a = 20;
var b = "20";
if (a === b) {
alert("They are equal");
} else {
alert("They are not equal");
}
Mas não entendo como usar "==" para comparar apenas o valor resulta na mensagem "Eles são iguais".
var a = 20;
var b = "20";
if (a == b) {
alert("They are equal");
} else {
alert("They are not equal");
}
Como os valores são iguais?A string "20" não está armazenada como os caracteres ASCII 50 e 48 (0110010 e 0110000 em binário) e 20 armazenado como o número binário real 0010100?
EDITAR:Obrigado a todos!Acho que todas as respostas são ótimas e me ajudaram a entender isso muito melhor.
Solução
o ==
O operador compara apenas os valores das variáveis. Se os tipos forem diferentes, uma conversão será operada. Portanto, o número 20 é convertido na sequência "20" e o resultado é comparado.
o ===
O operador compara não apenas os valores, mas também os tipos, portanto, nenhum elenco é operado. Nesse caso "20" !== 20
Outras dicas
Quando a conversão de tipo é necessária, o JavaScript converte operandos String, Number, Boolean ou Object da seguinte maneira.
- Ao comparar um número e uma string, a string é convertida em um valor numérico.JavaScript tenta converter o literal numérico da string em um valor do tipo Number.Primeiro, um valor matemático é derivado do literal numérico da string.A seguir, esse valor é arredondado para o valor do tipo Número mais próximo.
- Se um dos operandos for booleano, o operando booleano será convertido em 1 se for verdadeiro e +0 se for falso.
- Se um objeto for comparado com um número ou string, o JavaScript tentará retornar o valor padrão do objeto.Os operadores tentam converter o objeto em um valor primitivo, um valor String ou Number, usando os métodos valueOf e toString dos objetos.Se esta tentativa de conversão do objeto falhar, um erro de tempo de execução será gerado.
O problema com a comparação == é que o JavaScript versão 1.2 não realiza conversão de tipo, enquanto as versões 1.1 e 1.3 em diante o fazem.
A comparação === está disponível desde a versão 1.3 e é a melhor maneira de verificar a correspondência de duas variáveis.
Se você precisar que seu código seja compatível com as versões 1.1, 1.2 e 1.3 do código JavaScript, você deve garantir que todas as variáveis correspondam como se fosse uma comparação === que estava sendo executada.
O mecanismo JavaScript vê o A como um número e lança o B para numerar antes da avaliação.
Parte da definição de "==" é que os valores serão convertidos para os mesmos tipos antes da comparação, quando possível. Isso se aplica a muitos idiomas digitados vagamente.
O JavaScript foi projetado de modo que uma string contendo números seja considerada "igual" a esse número. O motivo disso é a simplicidade de uso para o caso de usuários inserindo um número em um campo de entrada e o site o valida no JS - você não precisa lançar a string inserida para um número antes de comparar.
Ele simplifica um caso de uso comum, e o operador === ainda permite comparar com o tipo considerado também.
Até onde eu sei, o JavaScript faz conversão automática de tipo de dados em tempo real - então talvez as variáveis sejam convertidas automaticamente em tipos equivalentes.