8.1 Псевдовипадкові числа
Іноді програміст стикається з простими, здавалося б, завданнями: «обрати випадковий фільм для вечірнього перегляду зі списку», «вибрати переможця лотереї», «перемішати список пісень при струшуванні смартфона», «обрати випадкове число для шифрування повідомлення», і кожного разу в нього виникає цілком закономірне питання: а як отримати саме це випадкове число?
Взагалі-то, якщо тобі потрібно отримати «справжнє випадкове число», зробити це доволі складно. Іноді навіть у комп'ютер вбудовують спеціальні математичні сопроцесори, які вміють генерувати такі числа, дотримуючись вимог до «істинної випадковості».
Тому програмісти придумали своє рішення — псевдовипадкові числа. Псевдовипадкові числа — це деяка послідовність, числа в якій на перший погляд здаються випадковими, але спеціаліст при детальному аналізі зможе знайти в них певні закономірності. Для шифрування секретних документів такі числа не підійдуть, але для імітації кидання кубика в грі — цілком.
Є багато алгоритмів генерації послідовності псевдовипадкових чисел і майже всі з них генерують наступне випадкове число на основі попереднього та ще якихось допоміжних чисел.
Наприклад, дана програма виведе на екран 1000 неповторюваних чисел:
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);
}
До речі, ми говоримо не про псевдовипадкові числа, а саме про послідовність таких чисел, адже, дивлячись на одне число, неможливо зрозуміти, випадкове воно чи ні.
Випадкове число можна отримати різними способами:
function getNextRandom() {
return 4; // це точно випадкове число (я викинув його за допомогою кубиків)
}
8.2 Оператор switch
Оператор switch використовується для виконання одного з декількох шматків коду в залежності від значення виразу. Він особливо корисний, коли необхідно порівняти одне значення з кількома можливими варіантами.
Синтаксис:
switch(expression) {
case value1:
// код, який виконається, якщо expression === value1
break;
case value2:
// код, який виконається, якщо expression === value2
break;
// ...
default:
// код, який виконається, якщо жодне зі значень не співпало
}
Приклад:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Понеділок";
break;
case 2:
dayName = "Вівторок";
break;
case 3:
dayName = "Середа";
break;
case 4:
dayName = "Четвер";
break;
case 5:
dayName = "П'ятниця";
break;
case 6:
dayName = "Субота";
break;
case 7:
dayName = "Неділя";
break;
default:
dayName = "Невірний день";
}
console.log(dayName); // "Середа"
8.3 Оператор ??
Оператор ??, або nullish coalescing operator, використовується для призначення значення за замовчуванням, якщо лівий операнд є null або undefined. Це дозволяє уникнути застосування значення за замовчуванням для інших хибних значень, таких як 0, false, або порожній рядок ("").
Синтаксис:
let result = value1 ?? value2;
Якщо value1 не null або undefined, result буде value1. В іншому випадку result буде value2.
Приклади:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0 не є null або undefined)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
Різниця з логічним АБО (||)
Оператор || також може використовуватися для завдання значення за замовчуванням, але він повертає правий операнд для будь-яких хибних значень, таких як 0, "", або NaN.
Приклад порівняння:
let value = 0 || 'default';
console.log(value); // 'default' (оскільки 0 - хибне значення)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (оскільки 0 не є null або undefined)
Застосування
Оператор ?? корисний в ситуаціях, коли потрібно вказати значення за замовчуванням тільки для null або undefined, але зберегти хибні значення, такі як 0 або "".
Реальні приклади застосування
Приклад 1. Значення за замовчуванням у об'єктах конфігурації:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// решта логіки налаштування
}
Приклад 2. Параметри за замовчуванням для функцій:
function printMessage(message) {
message = message ?? 'Повідомлення відсутнє';
console.log(message);
}
printMessage(null); // 'Повідомлення відсутнє'
printMessage('Привіт'); // 'Привіт'
Використання оператора ?? дозволяє писати чистіший і передбачуваний код, особливо в ситуаціях, коли важливо враховувати тільки відсутність значення (null або undefined).
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ