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.
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
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.
undefined.undefined.undefined.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
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
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).
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.
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.
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' }
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 }
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'
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.
'invalid ticket !!!' si el boleto aún no se vendió o el identificador no se encontró en el objeto de seguimientoconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'
simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'
simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'
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
Regístrate en Exercism para aprender y dominar JavaScript con 37 conceptos159 ejercicios y mentoría humana real, todo gratis.