8.1 Pseudolosowe liczby
Czasami programista napotyka proste, wydawałoby się, zadania: „wybrać losowy film do wieczornego oglądania z określonej listy”, „wybrać zwycięzcę loterii”, „wymieszać listę piosenek przy potrząsaniu smartfonem”, „wybrać losową liczbę do zaszyfrowania wiadomości” i za każdym razem zadaje sobie bardzo słuszne pytanie: jak zdobyć tę losową liczbę?
W ogóle, jeśli chcesz otrzymać „prawdziwą losową liczbę”, to jest to dość trudne. Dochodzi aż do tego, że do komputera wbudowywane są specjalne matematyczne koprocesory, które potrafią generować takie liczby, spełniając wszystkie wymagania „prawdziwej losowości”.
Dlatego programiści wymyślili swoje rozwiązanie — pseudolosowe liczby. Pseudolosowe liczby to pewna sekwencja, której liczby na pierwszy rzut oka wydają się losowe, ale specjalista po dokładnej analizie może znaleźć w nich pewne regularności. Dla zaszyfrowania tajnych dokumentów takie liczby nie będą odpowiednie, ale do imitacji rzutu kostką w grze — jak najbardziej.
Istnieje wiele algorytmów generowania sekwencji pseudolosowych liczb i prawie wszystkie z nich generują następną losową liczbę na podstawie poprzedniej i jeszcze jakichś pomocniczych liczb.
Na przykład, ten program wyświetli na ekranie 1000 unikalnych liczb:
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);
}
Swoją drogą, mówimy nie o pseudolosowych liczbach, a właśnie o sekwencji takich liczb, bo patrząc na jedną liczbę nie można zrozumieć, czy jest losowa, czy nie.
Losową liczbę można przecież uzyskać na różne sposoby:
function getNextRandom() {
return 4; # to na pewno losowa liczba (wyrzuciłem ją za pomocą kostek)
}
8.2 Operator switch
Operator switch
jest używany do wykonania jednego z kilku bloków kodu w zależności od wartości
wyrażenia. Jest szczególnie przydatny, kiedy trzeba porównać jedną wartość z kilkoma możliwymi opcjami.
Składnia:
switch(expression) {
case value1:
// kod, który wykona się, jeśli expression === value1
break;
case value2:
// kod, który wykona się, jeśli expression === value2
break;
// ...
default:
// kod, który wykona się, jeśli żadna z wartości nie pasuje
}
Przykład:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "Poniedziałek";
break;
case 2:
dayName = "Wtorek";
break;
case 3:
dayName = "Środa";
break;
case 4:
dayName = "Czwartek";
break;
case 5:
dayName = "Piątek";
break;
case 6:
dayName = "Sobota";
break;
case 7:
dayName = "Niedziela";
break;
default:
dayName = "Nieprawidłowy dzień";
}
console.log(dayName); // "Środa"
8.3 Operator ??
Operator ??
, czyli nullish coalescing operator, używany jest do przypisania wartości domyślnej,
jeśli lewy operand jest null
lub undefined
. Pozwala uniknąć zastosowania wartości
domyślnej dla innych fałszywych wartości, takich jak 0
, false
czy pusta stringa (""
).
Składnia:
let result = value1 ?? value2;
Jeśli value1 nie jest null
ani undefined
, result będzie value1. W przeciwnym razie result będzie value2.
Przykłady:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0 nie jest null lub undefined)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
Różnica od logicznego LUB (||)
Operator ||
również może być używany do zadawania wartości domyślnej, ale zwraca prawy
operand dla wszystkich fałszywych wartości, takich jak 0
, ""
czy NaN
.
Przykład porównania:
let value = 0 || 'default';
console.log(value); // 'default' (ponieważ 0 - fałszywa wartość)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (ponieważ 0 nie jest null lub undefined)
Zastosowanie
Operator ??
jest użyteczny w sytuacjach, kiedy konieczne jest ustawienie wartości domyślnej tylko dla null
lub undefined
, ale zachowanie fałszywych wartości, takich jak 0
lub ""
.
Prawdziwe przykłady użycia
Przykład 1. Wartości domyślne w obiektach konfiguracji:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// reszta logiki konfiguracji
}
Przykład 2. Parametry domyślne dla funkcji:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
Użycie operatora ??
pozwala pisać bardziej czysty i przewidywalny kod, szczególnie w sytuacjach,
kiedy ważne jest uwzględnienie tylko braku wartości (null
lub undefined
).
GO TO FULL VERSION