Przejdź do głównej zawartości

Bug #068

🪲 Znajdź buga

const numbers = [11, 2, 27, 1]
const sorted = numbers.sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

Jakie wartości zostaną zalogowane do konsoli?

🧪 Rozwiązanie

const numbers = [11, 2, 27, 1]
const sorted = [...numbers].sort((a, b) => a - b)
sorted[0] = 100

console.log(sorted)
console.log(numbers)

W przykładzie z błędem, stała numbers oraz sorted zwróci tą samą tablicę [100, 2, 11, 27].

Sortowanie działa poprawnie, problem leży jednak w mutowaniu oryginalnej tablicy poprzez metodę sort().

Metoda sort(), nie wykonuje kopii tablicy, na której zostanie wykonana. Modyfikuje oryginalną tablicę i zwraca efekt tej modyfikacji.

Po posortowaniu liczb, tablica sorted, na pozycji 0 posiada wartość 1.

Ta wartość jest jednak podmieniona na wartość 100 za pomocą sorted[0] = 100.

Z uwagi na wspomnianą wcześniej cechę działania sort(), kolejnym modyfikacjom tablicy sorted, ulega również tablica numbers.

Dobrze o tym pamiętać, szczególnie, że JavaScript jest tutaj niespójny.

Niektóre metody, takie jak np. slice(), map(), concat(), zwracają kopię oryginalnej tablicy, przez co późniejsze modyfikacje nie dotykają oryginału (nie mutują).

Inne, jak np. push(), reverse(), sort(), modyfikują oryginalną tablice (mutują).

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js