Percursos
/
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. Alterar o tipo de uma variável pode ser feito com uma conversão de tipos explícita. Além disso, o JavaScript também realiza coerção de tipos (conversão de tipos implícita) quando o contexto o exige.

Conversão de tipos

O JavaScript não tem um construto para converter para um tipo (diferente), como muitas outras linguagens, mas podes usar alguns auxiliares incorporados em vez disso. Em particular, Boolean, Number e String podem ser usados como funções para converter um valor no tipo respetivo.

Converter para Boolean (valores truthy/falsy)

Com Boolean(value) podes converter qualquer valor num Boolean. Existe um conjunto fixo de valores, os chamados valores falsy, que são convertidos em false. Os mais importantes: false, 0, a string vazia, null, undefined e NaN são falsy.

Para todos os outros valores, Boolean devolve true. A estes valores chamamos truthy.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Repara que, devido às regras descritas, '0', 'false', [] e {} são truthy em JavaScript.

Converter para número

Podes usar Number(value) para converter um valor num número. Os espaços em branco no início e no fim de uma string são ignorados e uma string vazia é convertida em 0. Se tentares 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

Converter para string

Com String(value) podes converter um valor numa string. Para valores primitivos, o resultado é o que esperarias.

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

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

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

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

No caso dos arrays, a função String aplica a conversão para string a cada elemento e junta os resultados com uma vírgula. Também podes aplicar tu o método join, por exemplo, para personalizares o separador. Repara que, nestes casos, null e undefined são convertidos numa string vazia.

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

No caso dos objetos, por predefinição, String devolve um texto pouco útil.

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

Coerção de tipos

Em certos contextos, o JavaScript converte automaticamente um valor noutro tipo de dados antes de avaliar uma instrução. A esta conversão implícita chamamos coerção de tipos.

Contexto Boolean

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

A coerção para Boolean ocorre habitualmente:

  • na condição de um condicional
  • no primeiro operando do operador ternário ?
  • no operando do operador lógico de negação !
  • nos 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á coagido para string. A lógica de conversão é a mesma da função String. Depois, as duas strings são concatenadas.

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

Contexto numérico

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

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

Consulta a lista de operadores da MDN para mais detalhes sobre qualquer um destes operadores.

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

Instruções

O teu amigo Kojo é um grande fã de números. Tem um pequeno site chamado 'fun-with-numbers'. O Kojo não é muito bom a programar, por isso pediu-te ajuda.

Vais criar duas funções auxiliares para novos jogos de números no site do Kojo e uma terceira para validar os valores de entrada que o utilizador pode introduzir.

1. Calcular a soma dos números da máquina de slots

Um dos jogos do site do Kojo parece uma máquina de slots que mostra dois grupos de rodas com algarismos. Cada grupo de algarismos representa um número. Para a mecânica do jogo, o Kojo precisa de saber a soma desses dois números.

Escreve uma função twoSum que aceita dois arrays como parâmetros. Cada array é composto por um ou mais números entre 0 e 9. A função deve interpretar cada array como um número e devolver 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. Determinar se um número é um palíndromo

Outro jogo do site é um pequeno questionário chamado "Lucky Numbers". O utilizador pode introduzir um número e depois vê se esse número pertence a uma sequência ou padrão secreto. A sequência ou padrão dos números da sorte muda todos os meses e cada utilizador só tem um número limitado de tentativas para o adivinhar.

Os números da sorte deste mês devem ser números que são palíndromos. Um número palindrómico continua igual quando se invertem os algarismos.

Implementa a nova função luckyNumber que aceita um número como parâmetro. A função deve devolver 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. Gerar uma mensagem de erro para valores de entrada inválidos do utilizador

Em vários locais do site, há campos de entrada onde os utilizadores podem introduzir números e clicar num botão para desencadear uma ação. O Kojo quer melhorar a experiência do utilizador do seu site. Quer mostrar uma mensagem de erro caso o utilizador clique no botão mas o campo contenha um valor de entrada inválido.

Eis mais alguma informação sobre como é fornecido o valor de um campo de entrada.

  • Se o utilizador escrever algo num campo, o valor associado é sempre uma string, mesmo que o utilizador só tenha escrito números.
  • Se o utilizador escrever algo mas apagar de novo, a variável será uma string vazia.
  • Antes de o utilizador começar a escrever, a variável pode ser undefined ou null.

Escreve uma função errorMessage que aceita os valores de entrada do utilizador como parâmetro. Se o utilizador não fornecer nenhum valor de entrada, errorMessage deve devolver 'Required field'. Se o valor de entrada não representar um número diferente de zero (de acordo com as regras de conversão do JavaScript), deve ser devolvido 'Must be a number besides 0'. Em todos os outros casos, podes assumir que o valor de entrada é válido; o valor devolvido deve ser uma string vazia.

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

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

errorMessage('abc');
// => 'Must be a number besides 0'
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Números da sorte?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.