Tracks
/
JavaScript
JavaScript
/
Ejercicios
/
Parque de diversiones
Parque de diversiones

Parque de diversiones

Ejercicio de aprendizaje

Introducción

A diferencia de muchos otros lenguajes, en JavaScript existen dos entidades distintas que representan la ausencia de un valor (significativo). Se trata de null y undefined.

Null

El valor primitivo null se usa como un «valor vacío» intencional para variables de cualquier tipo.

let name = null;
// name is intentionally set to "empty" because it is not
// available

Puedes comprobar si una variable es null usando el operador de igualdad estricta ===.

let name = null;

name === null;
// => true

Undefined

Una variable a la que no se le ha asignado un valor es de tipo undefined.1

Esto significa que, mientras que null representa un valor vacío (pero aún así un valor), undefined representa la ausencia total de un valor. 🤯

undefined aparece en distintos contextos.

  • Si una variable se declara sin un valor (inicialización), es undefined.
  • Si intentas acceder al valor de una clave que no existe en un objeto, obtienes undefined.
  • Si una función no devuelve un valor, el resultado es undefined.
  • Si no se pasa un argumento a una función, este es undefined, a menos que ese argumento tenga un valor predeterminado.
let name;
console.log(name);
// => undefined

Puedes comprobar si una variable es undefined usando el operador de igualdad estricta ===.

let name;

name === undefined;
// => true

Encadenamiento opcional

Si intentas obtener un valor anidado dentro de un objeto pero la clave padre no existe, JavaScript lanzará un error. Para evitar esto fácilmente, el encadenamiento opcional se agregó a la especificación del lenguaje en 2020. Con el operador de encadenamiento opcional ?. puedes asegurarte de que JavaScript solo intente acceder a la clave anidada si la clave padre no era null ni undefined. De lo contrario, se devuelve undefined.

const obj = {
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
};

obj.address.zipCode;
// => undefined

obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined

obj.residence?.street;
// => undefined

Coalescencia nula

Hay situaciones en las que quieres aplicar un valor predeterminado en caso de que una variable sea null o undefined (pero solo entonces). Para resolver esto, el operador de coalescencia nula ?? se introdujo en 2020. Devuelve el operando de la derecha solo cuando el operando de la izquierda es null o undefined. De lo contrario, se devuelve el operando de la izquierda.

let amount = null;
amount = amount ?? 1;
// => 1

amount = 0;
amount = amount ?? 1;
// => 0

[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (consultado el 4 de junio de 2021).

Instrucciones

Tu trabajo consiste en proporcionar y mantener partes del sistema informático de un parque de diversiones. En particular, eres responsable del programa que gestiona a los visitantes y los boletos.

Primero, crearás un nuevo visitante en el sistema. Después, proporcionarás una función para revocar un boleto. En las tareas 3 y 4, trabajarás en el sistema de seguimiento de boletos que ayuda a prevenir falsificaciones. Por último, ayudarás a adaptar el sistema a los nuevos requisitos legales.

1. Crea un nuevo visitante

Cuando los visitantes llegan al parque de diversiones por primera vez, deben registrarse ingresando su nombre y edad en una terminal y aceptando los términos y condiciones. Por supuesto, también necesitan comprar un boleto. Cada boleto tiene un identificador como H32AZ123.

Escribe una función createVisitor que acepte tres argumentos.

  • El nombre del visitante.
  • La edad del visitante.
  • El identificador del boleto que compró el visitante.

La función debe devolver un objeto que contenga esta información. Las claves del objeto deben llamarse name, age y ticketId.

createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }

2. Revoca el boleto

Cuando las personas salen del parque de diversiones, su boleto se revoca. Si vuelven, necesitan comprar uno nuevo. Para ahorrarles tiempo a los visitantes frecuentes, solo necesitan registrarse una vez y la información del visitante se conserva para las visitas posteriores.

Eso significa que cuando un visitante sale del parque, solo se debe invalidar su boleto, pero el resto del objeto del visitante debe permanecer igual. Implementa la función revokeTicket que acepte un objeto de visitante, establezca el identificador del boleto en null y devuelva el objeto después.

const visitor = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }

3. Determina el estado del boleto

Para prevenir falsificaciones, los identificadores de los boletos son únicos. Una vez que se imprime un boleto, su identificador se agrega como clave en un objeto del sistema para poder hacerle seguimiento.

Antes de que el boleto se venda a un visitante, se almacena con el valor null en el objeto de seguimiento de boletos. Cuando se vende a un visitante, el nombre del visitante se asigna como valor. Cuando los empleados tienen dudas sobre la validez de un boleto, necesitan consultar el estado del boleto en el sistema.

Implementa una función ticketStatus que acepte el objeto de seguimiento y un identificador de boleto como argumentos. Debe devolver uno de los siguientes resultados.

  • 'unknown ticket id' si el identificador no se encontró en el objeto de seguimiento
  • 'not sold' en caso de que el boleto se haya impreso pero no vendido
  • 'sold to {name}' donde {name} es el nombre del visitante si el boleto se vendió
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'

ticketStatus(tickets, '0H2AZ123');
// => 'not sold'

ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'

4. Mejora la respuesta del estado del boleto

Después de un tiempo, recibes comentarios de los empleados de que quieren que el estado del boleto sea más fácil de entender a primera vista. Solo quieren ver el nombre del visitante o que el boleto no es válido.

Escribe una función simpleTicketStatus que acepte los mismos argumentos que ticketStatus en la tarea 3. Esta función solo devuelve uno de dos resultados diferentes.

  • el nombre del visitante si el boleto se vendió
  • 'invalid ticket !!!' si el boleto aún no se vendió o el identificador no se encontró en el objeto de seguimiento
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'

simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'

simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'

5. Determina la versión de los términos y condiciones

Debido a los nuevos requisitos legales, los objetos de visitante recién creados ahora también contienen información detallada sobre los «Términos y Condiciones Generales» (GTC) que el usuario aceptó. Puedes ver un ejemplo del nuevo objeto de visitante a continuación.

Los cajeros del parque de diversiones ahora necesitan verificar si un visitante debe firmar una nueva versión de los GTC. Para esto, implementa una función gtcVersion que acepte un objeto de visitante como argumento y devuelva la versión de los GTC si está disponible. Si la información de la versión no está disponible, no se debe devolver nada.

const visitorNew = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
  gtc: {
    signed: true,
    version: '2.1',
  },
};

gtcVersion(visitorNew);
// => '2.1'

const visitorOld = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

gtcVersion(visitorOld);
// => undefined
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
JavaScript Exercism

¿Todo listo para empezar Parque de diversiones?

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