8.1 Números Pseudoaleatorios
A veces el programador se enfrenta a tareas simples, al parecer: "seleccionar una película aleatoria para ver por la noche de una lista específica", "elegir al ganador de una lotería", "mezclar la lista de canciones al agitar el smartphone", "elegir un número aleatorio para encriptar un mensaje", y cada vez surge una pregunta muy lógica: ¿cómo obtener ese mismo número aleatorio?
En realidad, si necesitas obtener un "número verdaderamente aleatorio", es bastante difícil. Hasta el punto de que en la computadora se integran coprocesadores matemáticos especiales que pueden generar tales números, cumpliendo todos los requisitos de la "verdadera aleatoriedad".
Por eso los programadores idearon su propia solución: los números pseudoaleatorios. Los números pseudoaleatorios son una secuencia en la que los números al principio parecen aleatorios, pero un especialista con un análisis detallado podrá encontrar ciertas regularidades en ellos. Para cifrar documentos secretos, tales números no son adecuados, pero para simular el lanzamiento de un dado en un juego, sí.
Hay muchos algoritmos para generar secuencias de números pseudoaleatorios y casi todos ellos generan el siguiente número aleatorio basado en el anterior y algunos otros números auxiliares.
Por ejemplo, este programa mostrará en pantalla 1000 números únicos:
let a = 41;
let c = 11119;
let m = 11113;
let seed = 1;
function getNextRandom() {
seed = (a * seed + c) % m;
return seed;
}
for (let t = 0; t < 1000; t++) {
let x = getNextRandom();
console.log(x);
}
Por cierto, no estamos hablando de números pseudoaleatorios, sino específicamente de una secuencia de tales números, ya que al observar un solo número es imposible entender si es aleatorio o no.
Un número aleatorio se puede obtener de diferentes maneras:
function getNextRandom() {
return 4; # este es definitivamente un número aleatorio (lo obtuve lanzando dados)
}
8.2 Operador switch
El operador switch
se usa para ejecutar uno de varios bloques de código dependiendo del valor de la expresión. Es especialmente útil cuando es necesario comparar un valor con varias opciones posibles.
Sintaxis:
switch(expression) {
case value1:
// código a ejecutar si expression === value1
break;
case value2:
// código a ejecutar si expression === value2
break;
// ...
default:
// código a ejecutar si ninguno de los valores coincide
}
Ejemplo:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Lunes";
break;
case 2:
dayName = "Martes";
break;
case 3:
dayName = "Miércoles";
break;
case 4:
dayName = "Jueves";
break;
case 5:
dayName = "Viernes";
break;
case 6:
dayName = "Sábado";
break;
case 7:
dayName = "Domingo";
break;
default:
dayName = "Día inválido";
}
console.log(dayName); // "Miércoles"
8.3 Operador ??
El operador ??
, o nullish coalescing operator, se utiliza para asignar un valor por defecto si el operando izquierdo es null
o undefined
. Permite evitar aplicar el valor por defecto para otros valores falsos, como 0
, false
, o una cadena vacía (""
).
Sintaxis:
let result = value1 ?? value2;
Si value1 no es null
o undefined
, result será value1. De lo contrario, result será value2.
Ejemplos:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0 no es null o undefined)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
Diferencia respecto al operador lógico OR (||)
El operador ||
también se puede usar para asignar un valor por defecto, pero devuelve el operando derecho para cualquier valor falso, como 0
, ""
, o NaN
.
Ejemplo de comparación:
let value = 0 || 'default';
console.log(value); // 'default' (porque 0 es un valor falso)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (porque 0 no es null o undefined)
Aplicación
El operador ??
es útil en situaciones donde necesitas asignar un valor por defecto solo para null
o undefined
, pero conservar valores falsos, como 0
o ""
.
Ejemplos reales de uso
Ejemplo 1. Valores por defecto en objetos de configuración:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// resto de la lógica de configuración
}
Ejemplo 2. Parámetros por defecto para funciones:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
El uso del operador ??
permite escribir código más limpio y predecible, especialmente en situaciones donde es importante considerar solo la ausencia de valor (null
o undefined
).
GO TO FULL VERSION