Trilhas
/
JavaScript
JavaScript
/
Exercícios
/
Números da sorte
Números da sorte

Números da sorte

Exercício de aprendizagem

Introdução

Em JavaScript, os valores podem ser de tipos diferentes. Mudar o tipo de uma variável pode ser feito com uma conversão de tipo explícita. Além disso, o JavaScript também realiza uma coerção de tipo (conversão de tipo implícita) quando o contexto exige.

Conversão de tipo

O JavaScript não tem um construto para converter um valor em um tipo (diferente), como acontece em muitas outras linguagens, mas alguns auxiliares internos podem ser usados no lugar. Os exemplos mais notáveis são Boolean, Number e String, que podem ser usados como funções para converter um valor no tipo correspondente.

Convertendo para Boolean (valores truthy/falsy)

Com Boolean(value), você pode converter qualquer valor em um Boolean. Existe um conjunto fixo de valores, os chamados valores falsy, que se convertem em false. O mais importante: false, 0, string vazia, null, undefined e NaN são falsy.

Para todos os outros valores, Boolean retorna true. Esses valores são chamados de truthy.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Repare que, por causa das regras descritas, '0', 'false', [] e {} são truthy em JavaScript.

Convertendo para número

Number(value) pode ser usado para converter um valor em um número. Espaços em branco no início e no fim de uma string são ignorados, e uma string vazia é convertida em 0. Se você tentar converter um valor não primitivo ou uma string que não representa um número, o resultado é NaN (Not-A-Number).

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

Convertendo para string

Com String(value), você pode converter um valor em uma string. Para valores primitivos, o resultado é o que você esperaria.

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

No caso de arrays, a função String aplica a conversão para string em cada elemento e junta os resultados com uma vírgula. Você também pode aplicar o próprio método join, por exemplo, para personalizar o separador. Repare que, nesses casos, null e undefined são convertidos em uma string vazia.

String([42, null, true, 'abc']);
// => '42,,true,abc'

No caso de objetos, por padrão String retorna um texto pouco útil.

String({ key: 'value' });
// => '[object Object]'

Coerção de tipo

Em certos contextos, o JavaScript converte automaticamente um valor em outro tipo de dado antes de avaliar uma instrução. Essa conversão implícita é chamada de coerção de tipo.

Contexto Boolean

Quando um valor que não é Boolean é usado em um contexto Boolean, o JavaScript aplica as mesmas regras da função Boolean para converter o valor implicitamente.

A coerção para Boolean costuma acontecer em:

  • a condição de uma condicional
  • o primeiro operando do operador ternário ?
  • o operando do operador lógico de negação !
  • os operandos dos operadores lógicos AND && e OR || (o resultado da expressão é um dos operandos, não necessariamente um Boolean)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

Contexto de string

Se o operador de adição + for usado com valores primitivos e um dos operandos for uma string, o outro também será convertido em string. A lógica de conversão é a mesma da função String. Depois disso, as duas strings são concatenadas.

let name;
'hello ' + name;
// => 'hello undefined'

Contexto numérico

Muitos operadores convertem os operandos em números (se necessário) seguindo a lógica da função Number explicada acima.

  • Operadores aritméticos: + (se não houver string envolvida), -, *, /, %, **
  • Operadores unários de mais e de negação: +, -
  • Operadores relacionais (para operandos que não são string): >, >=, <, <=
  • Operadores bit a bit: |, &, ^, ~

Consulte a lista de operadores da MDN para mais detalhes sobre qualquer um desses operadores.

Para evitar erros, é uma boa prática sempre chamar Number explicitamente antes de aplicar esses operadores.

Instruções

Seu amigo Kojo é um grande fã de números. Ele tem um pequeno site chamado 'fun-with-numbers'. Kojo não é muito bom em programação, então pediu sua ajuda.

Você vai criar duas funções auxiliares para novos jogos de números no site do Kojo e uma terceira para validar uma entrada que o usuário pode digitar.

1. Calcule a soma dos números no caça-níqueis

Um dos jogos no site do Kojo parece um caça-níqueis que mostra dois grupos de roletas com dígitos. Cada grupo de dígitos representa um número. Para a mecânica do jogo, Kojo precisa saber a soma desses dois números.

Escreva uma função twoSum que aceita dois arrays como parâmetros. Cada array consiste em um ou mais números entre 0 e 9. A função deve interpretar cada array como um número e retornar a soma desses dois números.

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. Determine se um número é um palíndromo

Outro jogo no site é um pequeno quiz chamado "Lucky Numbers". Um usuário pode digitar um número e então vê se o número pertence a alguma sequência ou padrão secreto. A sequência ou o padrão dos "lucky numbers" muda a cada mês, e cada usuário tem apenas um número limitado de tentativas para adivinhar.

Os lucky numbers deste mês devem ser números que são palíndromos. Números palindrômicos permanecem iguais quando os dígitos são invertidos.

Implemente a nova função luckyNumber que aceita um número como parâmetro. A função deve retornar true se o número for um palíndromo e false caso contrário. O número de entrada será sempre um inteiro positivo.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. Gere uma mensagem de erro para entrada de usuário inválida

Em vários lugares do site, há campos de entrada onde os usuários podem digitar números e clicar em um botão para acionar alguma ação. Kojo quer melhorar a experiência do usuário no site dele. Ele quer mostrar uma mensagem de erro caso o usuário clique no botão, mas o campo contenha um valor de entrada inválido.

Aqui estão mais algumas informações sobre como o valor de um campo de entrada é fornecido.

  • Se o usuário digitar algo em um campo, o valor associado será sempre uma string, mesmo que o usuário tenha digitado apenas números.
  • Se o usuário digitar algo, mas apagar de novo, a variável será uma string vazia.
  • Antes mesmo de o usuário começar a digitar, a variável pode ser undefined ou null.

Escreva uma função errorMessage que aceita a entrada do usuário como parâmetro. Se o usuário não forneceu nenhuma entrada, errorMessage deve retornar 'Required field'. Se a entrada não representa um número diferente de zero (de acordo com as regras de conversão do JavaScript), 'Must be a number besides 0' deve ser retornado. Em todos os outros casos, você pode assumir que a entrada é válida, o valor de retorno deve ser uma string vazia.

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Números da sorte?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.