8.1 Números Pseudoaleatórios
Às vezes, o programador se depara com tarefas aparentemente simples: "escolher um filme aleatório para assistir à noite de uma lista determinada", "escolher o vencedor de uma loteria", "embaralhar uma lista de músicas ao agitar o smartphone", "escolher um número aleatório para criptografar uma mensagem", e cada vez surge uma pergunta muito natural: como obter esse número aleatório afinal?
Na verdade, se você precisa de "um número verdadeiramente aleatório", é bem complicado. Até a ponto de inserir no computador coprocessadores matemáticos especiais que consigam gerar esses números, cumprindo todos os requisitos de "aleatoriedade verdadeira".
Então os programadores criaram sua própria solução — números pseudoaleatórios. Números pseudoaleatórios são uma sequência que, à primeira vista, parece aleatória, mas um especialista, ao analisar detalhadamente, pode encontrar padrões determinados. Para criptografar documentos secretos, esses números não são adequados, mas para simular a rolagem de dados em um jogo, servem bem.
Há muitos algoritmos para gerar sequências de números pseudoaleatórios e quase todos geram o próximo número aleatório com base no anterior e em alguns outros números auxiliares.
Por exemplo, este programa exibirá na tela 1000 números não repetidos:
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);
}
A propósito, não falamos sobre números pseudoaleatórios, mas sim sobre a sequência desses números, porque ao olhar para um número só não dá para saber se é aleatório ou não.
Um número aleatório pode ser obtido de várias maneiras:
function getNextRandom() {
return 4; # esse é definitivamente um número aleatório (eu joguei com dados)
}
8.2 Operador switch
O operador switch é usado para executar um de vários blocos de código dependendo do valor de uma expressão. Ele é especialmente útil quando precisamos comparar um valor com várias opções possíveis.
Sintaxe:
switch(expression) {
case value1:
// código que será executado se expression === value1
break;
case value2:
// código que será executado se expression === value2
break;
// ...
default:
// código que será executado se nenhum dos valores corresponder
}
Exemplo:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Segunda-feira";
break;
case 2:
dayName = "Terça-feira";
break;
case 3:
dayName = "Quarta-feira";
break;
case 4:
dayName = "Quinta-feira";
break;
case 5:
dayName = "Sexta-feira";
break;
case 6:
dayName = "Sábado";
break;
case 7:
dayName = "Domingo";
break;
default:
dayName = "Dia inválido";
}
console.log(dayName); // "Quarta-feira"
8.3 Operador ??
O operador ??, ou nullish coalescing operator, é usado para atribuir um valor padrão se o operando à esquerda for null ou undefined. Ele permite evitar a aplicação do valor padrão para outros valores falsos, como 0, false, ou string vazia ("").
Sintaxe:
let result = value1 ?? value2;
Se value1 não for null ou undefined, result será value1. Caso contrário, result será value2.
Exemplos:
let foo = null ?? 'padrão';
console.log(foo); // 'padrão'
let bar = 0 ?? 'padrão';
console.log(bar); // 0 (0 não é null ou undefined)
let baz = undefined ?? 'padrão';
console.log(baz); // 'padrão'
Diferença do operador lógico OU (||)
O operador || também pode ser usado para definir um valor padrão, mas ele retorna o operando à direita para quaisquer valores falsos, como 0, "", ou NaN.
Exemplo de comparação:
let value = 0 || 'padrão';
console.log(value); // 'padrão' (porque 0 é um valor falso)
let value2 = 0 ?? 'padrão';
console.log(value2); // 0 (porque 0 não é null ou undefined)
Aplicação
O operador ?? é útil em situações onde precisamos definir um valor padrão apenas para null ou undefined, mas manter valores falsos, como 0 ou "".
Exemplos reais de uso
Exemplo 1. Valores padrões em objetos de configuração:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'azul';
// resto da lógica de configuração
}
Exemplo 2. Parâmetros padrões para funções:
function printMessage(message) {
message = message ?? 'Nenhuma mensagem fornecida';
console.log(message);
}
printMessage(null); // 'Nenhuma mensagem fornecida'
printMessage('Olá'); // 'Olá'
Usar o operador ?? permite escrever um código mais limpo e previsível, especialmente em situações onde é importante considerar apenas a ausência de valor (null ou undefined).
GO TO FULL VERSION