Considere o código JavaScript a seguir. var x1 var x2 var...
var x1
var x2
var x3
var y = 11
var z = 12
x1= z++ == ++y
x2= 10 + "casa"
x3= y+1 === z && 10 != "20"
Após a execução dessas operações, os valores de x1, x2 e x3 são, respectivamente:
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a D. Vamos entender o porquê, analisando cada uma das expressões dadas no código JavaScript:
x1 = z++ == ++y: Esta linha está comparando o valor de 'z' com 'y', após incrementar ambos. O operador
z++
é um pós-incremento, que retorna o valor de 'z' antes de incrementá-lo, e o operador++y
é um pré-incremento, que incrementa 'y' antes de retornar o seu valor. Portanto, 'z' é incrementado de 12 para 13 após sua avaliação na comparação, e 'y' é incrementado de 11 para 12 antes de sua avaliação. A comparação é entre 12 (valor original de 'z') e 12 (valor incrementado de 'y'), resultando em true.x2 = 10 + "casa": Quando você soma um número a uma string em JavaScript, o resultado é uma concatenação dos dois valores em forma de string. Portanto, o valor de 'x2' torna-se a string "10casa".
x3 = y+1 === z && 10 != "10": O primeiro operador de comparação
===
verifica se ambos os valores e tipos são iguais. Após o incremento anterior, 'y' é 12, então 'y+1' é 13, que é igual ao novo valor de 'z' pós-incremento. A segunda comparação utiliza o operador!=
, que verifica a desigualdade de valor, ignorando o tipo. Em JavaScript, o número 10 é, de fato, diferente da string "10" em valor e tipo, mas aqui estamos usando o operador que ignora o tipo, então 10 é considerado igual a "10". No entanto, a expressão 10 != "10" é false, pois o operador!=
faz uma conversão de tipo antes da comparação, resultando em que 10 é igual a "10" após a conversão. Portanto, x3 é false porque a segunda parte da operação && é false.
Portanto, após a execução do código fornecido, os valores de x1, x2 e x3 são, respectivamente, true, "10casa" e false, tornando a alternativa D a correta.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Acho que a principal dificuldade nessa questão é em relação aos operadores z++ e ++y. Existe uma diferença entre os dois tipos de atribuição
Seja uma variável N
se colocarmos n++
O javascript irá incrementar em 1 a variável n e, em seguida, retornará o incremento
se colocarmos ++n
O javascript irá incrementar e retornar no mesmo momento a variável n + 1
No caso da questão:
y = 11
z = 12
x1= z++ == ++y // irá checar se z é igual a y
de acordo com o explicitado acima, o retorno será true, pois z++ continuará valendo 12, uma vez que não retorna de imediato e ++y valerá 12 a partir do momento em que foi declarado
Concordo com o Celso, mas acho importante também que no java script e em outras linguagens de tipagem dinâmica = significa atribuição de valor, == comparação de valores (no javascript com o duplo igual, 10 numeral e "10" texto sao iguais ). === vai fazer a comparação citada retro, bem como o tipo assim 10 numeral é diferente do "10" texto
Boa Gisely , esqueci de colocar rsrsrs. Obrigado por complementar
No JS é comparado Objeto e o atributo. Quando o Objeto é usado ==, quando o Objeto e o Atributo é usado ===, na questão vimos que são declaradas cinco variáveis e depois os seus valores são reatribuídos. No primeiro caso vemos (x1= z++ == ++y) onde x1 esta sendo comparado a y apenas como objeto. e logo concluímos que é verdadeiro.
Complementando com a explicação da operação em x3:
x3= y+1 === z && 10 != "20"
Separando por partes:
y+1 === z
y+1 > 11+1 = 12
z = 12
logo são iguais numericamente e também iguais em tipo, logo = TRUE
&& - "E" lógico, conjunção (operador binário), com curto-circuito, ou seja, se a primeiro operação fosse FALSE, ele não avaliaria a segunda operação.
Como deu TRUE, avalia a segunda operação:
10 != "20"
O resultado é TRUE, porque 10 é diferente do caractere "20".
Resultado final:
x3 = TRUE && TRUE = TRUE
Obs: && só da TRUE quando AMBAS as partes dão TRUE.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo