Considere o seguinte código JavaScript, sabendo que o usuári...
var v1 = 3; var v2, v3, v4; v2 = prompt("Digite o número 3:"); v2 = prompt("Digite a palavra true:"); v4 = false;
console.log(v1===v2); console.log(v2==v3);
console.log(v1%=v2); console.log(v1);
Ao final da execução, quais valores serão impressos?
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa correta: B - false, false, NaN, NaN
Para resolver esta questão, é necessário entender os conceitos de tipos de dados e operadores em JavaScript, bem como a função prompt()
.
Primeiramente, o código declara a variável v1
com o valor 3 (um número inteiro). Após isso, são declaradas as variáveis v2
, v3
e v4
, mas apenas v4
é inicializada com o valor false (um valor booleano).
A função prompt()
é utilizada para capturar entrada do usuário no formato de uma string. No código, há um equívoco, pois a segunda chamada do prompt deveria provavelmente armazenar o valor em v3
, mas é novamente atribuído a v2
. Isso significa que o valor originalmente digitado para v2
será sobrescrito. Independentemente do valor que seria atribuído a v3
, ele permanece undefined, pois nunca é inicializado ou atribuído no código.
O primeiro console.log
compara se v1
é estritamente igual a v2
usando o operador de igualdade estrita ===
, que compara tanto o valor quanto o tipo. Como v1
é um número e v2
é uma string (mesmo que o usuário digite "3", ele é capturado como "3" - uma string), o resultado é false.
O segundo console.log
compara se v2
é igual a v3
usando o operador de igualdade ==
. Como v3
é undefined e v2
é uma string (neste caso, "true", digitada pelo usuário), o resultado é novamente false.
O terceiro console.log
exibe o resultado do operador de módulo %
entre v1
e v2
. O operador de módulo retorna o resto da divisão entre dois números. No entanto, como v2
é uma string e não pode ser convertida para um número válido, o resultado é NaN (Not a Number).
Por fim, o último console.log
simplesmente exibe o valor de v1
, que permaneceu inalterado como 3. No entanto, devemos notar que o gabarito da questão indica que o valor seria NaN. Isso sugere que há um erro no gabarito ou um erro de digitação na questão. Se o código fosse executado conforme descrito, o valor de v1
seria de fato 3. Porém, seguindo o gabarito fornecido, assumimos que o valor de v1
seria alterado posteriormente no código (não fornecido no enunciado) resultando em NaN.
Com base nessas informações, a alternativa correta, segundo o gabarito fornecido, é a B, a qual indica que os valores impressos seriam false, false, NaN, NaN. Contudo, com base na análise do código fornecido, sem considerar alterações externas, a resposta esperada seria false, false, NaN, 3.
É importante sempre revisar o código e o gabarito fornecido em questões de concursos públicos para assegurar que não existam erros ou inconsistências.
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
GAB B
Conceitos:
- "===" verifica se os operandos são do mesmo tipo e mesmo valor. "1" === 1 -> false
- "==" verifica se os operandos possuem o mesmo valor. "1" == 1 -> true
- "prompt" sempre retorna uma string, independente se digitar um number, boolean, etc
- "v1%=v2" equivale a "v1 = v1%v2"
Valores iniciais:
v1=3
v2="true"
v3=undefined
v4=false
Prints:
3 === "true" -> false
"true" == undefined -> false
v1 = v1%v2 -> 3%"true" -> NaN // não acharei valor válido no resto da divisão de um number por uma string
v1 -> NaN // observe que o valor de v1 foi alterado na linha anterior
Apenas complementando o colega @Leandro, que por sinal, contém diversos comentários top's, o operador "%" é chamado de módulo ou resto de uma divisão. Ex.: 10%2 = 0, pois o resto é 0 // 10%3 = 1, pois o resto é 1.
:::::::::::INDO MAIS FUNDO:::::::::::
- "v1%=v2" equivale a "v1 = v1%v2", ou seja, o valor de v1 é reatribuído com o conteúdo da variável v1 usando o operador módulo v2.
- Se os dois fossem números, seria exibido o resto da divisão, mas como um é do tipo string e o outro é do tipo número, fica difícil calcular (na dúvida, execute este comando em seu emulador e dê um typeof() para saber o tipo). Por isso o erro NAN.
>>Em frente e enfrente>>
b-
prompt() always returns a string, whether numbers or characters, with one exception. When the user clicks Cancel or presses the Esc key, prompt() returns null.
https://www.codecademy.com/forum_questions/5575df34937676a0b50000e8
1° console.log() false. v1 === v2 é false, compara 3 number com 3 string
prompt() always returns a string, whether numbers or characters, with one exception. When the user clicks Cancel or presses the Esc key, prompt() returns, null.
https://www.codecademy.com/forum_questions/5575df34937676a0b50000e8
2° console.log() false. v3 nao tem valor (undefined)
3° console.log() NaN - not a number. ele tenta receber o input de uma operacao modulus com numero e string, o que resulta em Nan.
4° console.log() NaN - como conseqeucnia de v1%=v2 acima, v1 recebeu Nan, em vez de um numeral, o q seria esperado de uma operação modulus com 2 numeros reais.
var v1 = 3;
var v2, v3, v4;
v2 = prompt("Digite o número 3:");
v2 = prompt("Digite a palavra true");
v4 = false;
console.log(v1 === v2);
console.log(v2 == v3);
console.log(v1 %= v2);
console.log(v1);
var v1 = 3;
A variável v1 é inicializada com o valor 3.
v2 = prompt("Digite o número 3:");
O prompt solicita ao usuário que digite "3". O valor digitado será armazenado em v2 como uma string. Por exemplo, se o usuário digitar 3, o valor de v2 será "3" (string).
v2 = prompt("Digite a palavra true");
A variável v2 é sobrescrita com o resultado de outro prompt. Se o usuário digitar "true", o valor de v2 será "true" (string).
v4 = false;
A variável v4 é atribuída com o valor booleano false.
Agora vamos ver o que os console.log imprimem:
1. console.log(v1 === v2);
Aqui estamos comparando v1 (que é o número 3) com v2 (que é a string "true") usando o operador de igualdade estrita (===).
A igualdade estrita compara tanto o valor quanto o tipo. Como v1 é um número e v2 é uma string, a comparação retornará false.
Resultado: false
2. console.log(v2 == v3);
Aqui estamos comparando v2 (que é "true", uma string) com v3, que não foi inicializado, então v3 tem o valor undefined.
O operador de igualdade fraca (==) converte os valores para o mesmo tipo antes de comparar, mas como undefined só é igual a null e undefined, a comparação retornará false.
Resultado: false
3. console.log(v1 %= v2);
Esse é o operador de atribuição com módulo (%=). Ele calcula o resto da divisão de v1 por v2 e atribui o resultado a v1.
O valor de v1 é 3, e o valor de v2 é "true". No entanto, v2 é uma string, então durante o cálculo, o JavaScript tenta converter "true" para um número.
Como a conversão de "true" para número resulta em NaN (Not-a-Number), a operação v1 %= v2 será 3 % NaN, o que resulta em NaN.
Resultado: NaN
4. console.log(v1);
Neste ponto, o valor de v1 foi alterado para NaN pela linha anterior.
Resultado: NaN
Resposta correta:
d) false, false, NaN, NaN
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo