Rutas
/
JavaScript
JavaScript
/
Ejercicios
/
Números de la suerte
Números de la suerte

Números de la suerte

Ejercicio de aprendizaje

Introducción

En JavaScript, los valores pueden ser de distintos tipos. Cambiar el tipo de una variable puede hacerse mediante una conversión de tipos explícita. Además, JavaScript también realiza una coerción de tipos (conversión de tipos implícita) cuando el contexto lo requiere.

Conversión de tipos

JavaScript no tiene una construcción para convertir a un tipo (distinto), como sí tienen muchos otros lenguajes, pero en su lugar se pueden usar algunos ayudantes integrados. En particular, Boolean, Number y String se pueden usar como funciones para convertir un valor al tipo correspondiente.

Conversión a Boolean (valores truthy/falsy)

Con Boolean(value) puedes convertir cualquier valor a Boolean. Hay un conjunto fijo de valores, los llamados valores falsy, que se convierten en false. En concreto, false, 0, el string vacío, null, undefined y NaN son falsy.

Para todos los demás valores, Boolean devuelve true. Estos valores se llaman truthy.

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

Ten en cuenta que, debido a las reglas descritas, '0', 'false', [] y {} son truthy en JavaScript.

Conversión a número

Number(value) se puede usar para convertir un valor a número. Los espacios en blanco al principio y al final de un string se ignoran, y un string vacío se convierte en 0. Si intentas convertir un valor no primitivo o un string que no representa un número, el resultado es NaN (Not-A-Number).

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

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

Number('');
// => 0

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

Conversión a string

Con String(value) puedes convertir un valor a string. El resultado es el que cabría esperar para valores primitivos.

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

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

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

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

Para los arrays, la función String aplicará la conversión a string a cada elemento y unirá los resultados con una coma. También puedes aplicar tú mismo el método join, por ejemplo para personalizar el separador. Ten en cuenta que, en estos casos, null y undefined se convertirán en un string vacío.

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

Para los objetos, por defecto String devuelve un texto poco útil.

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

Coerción de tipos

En ciertos contextos, JavaScript convierte automáticamente un valor a otro tipo de dato antes de evaluar alguna instrucción. Esta conversión implícita se llama coerción de tipos.

Contexto booleano

Cuando se usa un valor que no es booleano en un contexto booleano, JavaScript aplica las mismas reglas que la función Boolean para convertir el valor de forma implícita.

La coerción a booleano se da habitualmente en

  • la condición de un condicional
  • el primer operando del operador ternario ?
  • el operando del operador lógico NOT !
  • los operandos de los operadores lógicos AND && y OR || (el resultado de la expresión es uno de los operandos, no necesariamente un valor booleano)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

Contexto de string

Si se usa el operador de suma + con valores primitivos y uno de los operandos es un string, el otro también se convertirá por coerción a string. La lógica de conversión es la misma que al usar la función String. Después, los dos strings se concatenan.

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

Contexto numérico

Muchos operadores convierten los operandos a números por coerción (si es necesario) según la lógica de la función Number explicada antes.

  • Operadores aritméticos: + (si no hay ningún string de por medio), -, *, /, %, **
  • Operadores unarios de suma y de negación: +, -
  • Operadores relacionales (para operandos que no sean strings): >, >=, <, <=
  • Operadores a nivel de bits: |, &, ^, ~

Consulta la lista de operadores de MDN para obtener más detalles sobre cualquiera de esos operadores.

Para evitar errores, es buena práctica llamar siempre a Number explícitamente antes de aplicar esos operadores.

Instrucciones

Tu amigo Kojo es un gran aficionado a los números. Tiene un pequeño sitio web llamado «fun-with-numbers». Kojo no es muy bueno programando, así que te ha pedido ayuda.

Vas a crear dos funciones auxiliares para nuevos juegos de números en el sitio web de Kojo, y una tercera para validar cierta entrada que el usuario puede introducir.

1. Calcula la suma de los números de la tragaperras

Uno de los juegos del sitio web de Kojo se parece a una máquina tragaperras que muestra dos grupos de ruedas con dígitos. Cada grupo de dígitos representa un número. Para la mecánica del juego, Kojo necesita saber la suma de esos dos números.

Escribe una función twoSum que acepte dos arrays como parámetros. Cada array consta de uno o más números entre 0 y 9. La función debe interpretar cada array como un número y devolver la suma de esos dos números.

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

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

2. Determina si un número es un palíndromo

Otro juego del sitio web es un pequeño concurso llamado «Números de la suerte». El usuario puede introducir un número y luego ve si ese número pertenece a alguna secuencia o patrón secreto. La secuencia o el patrón de los «números de la suerte» cambia cada mes, y cada usuario solo tiene un número limitado de intentos para adivinarla.

Los números de la suerte de este mes deben ser números que sean palíndromos. Un número palindrómico no cambia al invertir sus dígitos.

Implementa la nueva función luckyNumber, que acepta un número como parámetro. La función debe devolver true si el número es un palíndromo y false en caso contrario. El número de entrada siempre será un entero positivo.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. Genera un mensaje de error para entradas de usuario no válidas

En varios lugares del sitio web hay campos de entrada donde los usuarios pueden introducir números y hacer clic en un botón para desencadenar alguna acción. Kojo quiere mejorar la experiencia de usuario de su sitio. Quiere mostrar un mensaje de error en caso de que el usuario haga clic en el botón pero el campo contenga un valor de entrada no válido.

Aquí tienes más información sobre cómo se proporciona el valor de un campo de entrada.

  • Si el usuario escribe algo en un campo, el valor asociado siempre es un string, incluso si solo ha escrito números.
  • Si el usuario escribe algo pero lo borra, la variable será un string vacío.
  • Antes de que el usuario empiece a escribir, la variable puede ser undefined o null.

Escribe una función errorMessage que acepte la entrada del usuario como parámetro. Si el usuario no ha proporcionado ninguna entrada, errorMessage debe devolver 'Required field'. Si la entrada no representa un número distinto de cero (según las reglas de conversión de JavaScript), debe devolverse 'Must be a number besides 0'. En todos los demás casos, puedes suponer que la entrada es válida y el valor devuelto debe ser un string vacío.

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

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

errorMessage('abc');
// => 'Must be a number besides 0'
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
JavaScript Exercism

¿Listo para empezar Números de la suerte?

Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.