9: Qual a diferença entre == e ===?
February 09, 2020
https://www.instagram.com/tv/B9j_oeXF244/
Caso queira executar os exemplos, use o codepen.io
A diferença entre == (abstrata) e === (estrita) é que 0 == compara por valor APÓS a coerção e === por valor e tipo sem coerção.
Vamos nos aprofundar no ==. Mas, primeiro vamos falar sobre coerção .
Javascript não tem tipagem forte, então ele sempre vai tentar fazer a conversão das variáveis pra fazer determinadas operações, isso é chamado de coerção que é o processo de converter um valor para outro tipo.
tá ligado quando você usa o if(algumObjeto)? por baixo dos panos o javascript converte esse maluco pra boolean e consegue dizer se ele existe ou não.
Voltando ao == ele faz essa coerção implícita que acabei de explicar, e para fazer isso ele segue um monte de regra maluca que depende de várias situações, que até o Brendan Eich tem dúvidas sobre isso então não se preocupe se você não entender de primeira.
![]()
SHOW ME THE CODE:
console.log('true == \'true\': ', true == 'true') // aqui vai dar true
console.log('true == \'1\': ', true == '1') // aqui vai dar true
console.log('true == true): ', true == true) // aqui vai dar true
console.log('[===] true === \'true\': ', true === 'true') // aqui vai dar false
console.log('[===]true === \'1\': ', true === '1') // aqui vai dar false
console.log('[===]true === true): ', true === true) // aqui vai dar trueSuponha que tenhamos que comparar x == y.
- Se
xeytiver o mesmo tipo. Em seguida, ele os compara com o operador===. - Se
xénulleyéundefinedentão retornetrue. - Se
xéundefinedeyénullentão retornetrue. - Se
xé do tiponumbereyé do tipostringretornex == toNumber(y). - Se
xé do tipostringeyé do tiponumberretornetoNumber(x) == y. - Se
xfor do tipobooleanretornetoNumber(x) == y. - Se
yfor do tipobooleanretornex == toNumber(y). - Se
xé um dos tipos (string,symbolounumber) eyé o tipoobjectentão retornex == toPrimitive(y). - Se
xfor umobjectexfor umstring,symbolEntão retornetoPrimitive(x) == y. - Senão, retorne
false.
Nota: toPrimitive usa primeiro o valueOf e depois o toString nos objetos para obter o valor primitivo desse objeto.
Vamos dar exemplos.
x |
y |
x == y |
|---|---|---|
5 |
5 |
true |
1 |
'1' |
true |
null |
undefined |
true |
0 |
false |
true |
'1,2' |
[1,2] |
true |
'[object Object]' |
{} |
true |
Todos esses exemplos retornam true.
O primeiro exemplo vai para a condição um porque xe y tem o mesmo tipo e valor.
O segundo exemplo vai para a condição quatro y é convertida em number antes de comparar.
O terceiro exemplo vai para a condição dois.
O quarto exemplo vai para a condição sete porque y é boolean.
O quinto exemplo vai para a condição oito . O array é convertido em string usando o toString()que retorna 1,2.
O último exemplo vai para a condição dez . O objeto é convertido em um string usando o toString() que retorna [object Object].
x |
y |
x === y |
|---|---|---|
5 |
5 |
true |
1 |
'1' |
false |
null |
undefined |
false |
0 |
false |
false |
'1,2' |
[1,2] |
false |
'[object Object]' |
{} |
false |
Se usarmos o operador ===, todas as comparações, com exceção do primeiro exemplo, retornarão false, porque não têm o mesmo tipo, enquanto o primeiro exemplo retornará true porque os dois têm o mesmo tipo e valor.
Ainda não entendeu? Calma, nem quem fez o JS entende isso direito (brinks) mas aqui estão alguns artigos legais pra tentar ao menos entender o básico disto:
- Sempre olhe a documentação oficial.
- Excelente artigo no Medium, falando a respeito.
- Consulte a tabela de igualdade do JS
- Exemplos de bizarrices no Javascript.
- Outros exemplos de bizarrice.
- Artigo interessante do Hackernoon.
Baseado no excelente artigo: 70 Interview Questions