O que exatamente é Coerção de Tipo em Javascript?
O que exatamente é coerção de tipo em Javascript?
Por exemplo, sobre o uso de == em vez de ===?
Resposta #1
Coerção de tipos significa que quando os operandos de um operador são de tipos diferentes, um deles será convertido para um valor "equivalente" do tipo do outro operando. Por exemplo, se você fizer:
boolean == integer
o operando booleano será convertido em um inteiro: false se torna 0, true se torna 1. Em seguida, os dois valores são comparados.
No entanto, se você usar o operador de comparação que não realiza conversão ===, nenhuma conversão ocorre. Quando os operandos são de tipos diferentes, esse operador retorna false e compara os valores apenas quando eles são do mesmo tipo.
A coerção não é feita apenas por operadores de comparação, embora eles sejam os únicos que têm variantes "estritas" e "flexíveis". A maioria dos operadores aritméticos converte automaticamente argumentos não numéricos em números, por exemplo, "50"/5 é tratado como 50/5. Também existem muitas funções e métodos incorporados que requerem argumentos de string; se você fornecer algo diferente, eles automaticamente os converterão em strings.
Mas tenha cuidado -- + é tanto o operador de adição aritmética quanto o operador de concatenação de strings -- se você fizer string + number, ele converte o número em uma string e concatena, em vez de converter a string em um número e somar. Esta é a fonte de muitos erros cometidos ao realizar operações aritméticas com a entrada do usuário, já que a entrada é uma string, a menos que você a converta explicitamente.
Você pode encontrar uma boa explicação das regras de coerção do JavaScript em You Don’t Know JS e uma documentação mais voltada para referência no MDN.
Resposta #2
Vamos começar com uma breve introdução aos sistemas de tipos, que eu acho que ajudará você a entender a ideia geral de coerção de tipos.
O sistema de tipos de uma linguagem define regras que nos dizem quais tipos de dados existem nessa linguagem e como eles podem ser combinados usando diferentes operadores. Por exemplo, uma dessas regras pode especificar que o operador de adição (+) só atua sobre números. Essas regras existem principalmente para evitar que você se prejudique. Mas o que acontece quando o programador quebra essa regra no programa? Não há nada impedindo o programador de digitar {} + {} ou “hello ” + 5 em um programa, mesmo que a linguagem não considere essas expressões como fazendo sentido algum.
O que acontece em última instância nessas situações depende de quão rigorosa a linguagem é em relação às suas regras de tipo.
Um sistema de tipos de linguagens frequentemente assume uma de duas posições sobre você violar suas regras:
- Diga “Ei, isso não é legal!” e imediatamente faça seu programa travar.
- Diga "Não posso fazer nada com {} ... mas posso fazer algo com números" e tente converter {} em um número.
Linguagens com sistemas de tipos que adotam a primeira posição sobre suas regras são coloquialmente chamadas de linguagens “fortemente tipadas”. Elas são rigorosas quanto a não permitir que você quebre suas regras. Aqueles que adotam a segunda abordagem (como o JavaScript) são chamados de linguagens “fracamente tipadas” ou “tipadas de forma frouxa”. Claro, você pode quebrar as regras, mas não se surpreenda quando ela converter o tipo de dado que você descreveu em seu programa à força, para cumprir suas regras. Esse comportamento é conhecido como… (rolar de tambor)... coerção de tipo.
Agora vamos olhar alguns exemplos em JavaScript. Primeiro, vamos começar com uma expressão que não leva à coerção de tipo.
5 + 5
Usar o operador + com dois números é perfeitamente válido. O programa tratará + como "adicionar" e somará felizmente os dois números. Nenhuma conversão é necessária.
Mas e sobre …
[] + 5
Ops. No JavaScript, + pode significar somar dois números ou concatenar duas strings. Neste caso, não temos nem dois números nem duas strings. Temos apenas um número e um objeto. De acordo com as regras de tipos do JavaScript, isso não faz sentido lógico. Como ele é flexível quanto a você quebrar suas regras, ao invés de travar, ele tenta entender de qualquer forma. Então, o que o JavaScript faz? Bem, ele sabe como concatenar strings, então converte tanto [] quanto 5 em strings e o resultado é o valor string “5 “.
Qual é a diferença entre os operadores de comparação == e ===? Por que existem dois operadores de comparação?
== não é imune ao comportamento de conversão de tipos do JavaScript. Expressões como 5 == “5” irão avaliar como verdadeiro porque o JavaScript tentará converter um deles para que esteja comparando o mesmo tipo de dado.
Em muitos casos, isso não é desejável porque você provavelmente quer saber se alguns dados com os quais está comparando são de um tipo diferente, para que possa decidir o que fazer a respeito. É aí que entra o operador ===. Quando você usa ===, nenhuma conversão de tipo ocorrerá. Portanto, a expressão 5 === “5” será avaliada como falsa.
