Analise o código JavaScript exibido a seguir. var numeros = [4,9,16]; var xpto = numeros.map(function(num) { return num << 2; }); Após a execução desse trecho de código, os valores de numeros e xpto são, respectivamente:
- A)undefined [16,36,64]
Errada, porque numeros não vira undefined e xpto é um array com valores numéricos, não apenas um resultado vazio.
- B)[4,9,16] [16,36,64]
Certa, pois map() não altera o array original e o operador << 2 transforma 4, 9 e 16 em 16, 36 e 64.
- C)null [0,1,4]
Errada, porque null não é o valor final de numeros e o deslocamento à esquerda não gera [0,1,4] nesse caso.
- D)[4,9,16] Null
Errada, porque numeros continua [4,9,16] e xpto não é null, já que map() retorna um novo array preenchido.
- E)[16,36,64] Undefined
Errada, porque [16,36,64] é o valor de xpto, não de numeros, e o segundo resultado não é Undefined.
Gabarito: B
Aqui o ponto principal é entender dois comportamentos bem comuns do JavaScript: o método map() e o operador bitwise <<. O map() percorre o array original e cria um novo array com o resultado da função passada, sem alterar o array de origem. Ou seja, o array numeros continua exatamente como estava, porque map() não faz mutação por padrão. No trecho, cada número recebe um deslocamento de bits para a esquerda em 2 posições. Na prática, isso equivale a multiplicar por 4. Então 4 vira 16, 9 vira 36 e 16 vira 64. O resultado fica em xpto. Assim, ao final, numeros permanece [4,9,16] e xpto fica [16,36,64]. É por isso que o gabarito é a letra B. Se você pensou que numeros seria alterado, caiu na confusão clássica entre métodos que retornam novo array e métodos que modificam o original. Em concursos, a banca gosta muito dessa diferença: map() gera uma nova coleção, enquanto operações como o deslocamento bit a bit só afetam o valor retornado na função, não o array original. Pequeno detalhe, grande pegadinha.