Przejdź do głównej zawartości

Bug #005

🪲 Znajdź buga

function addToArray(item, array) {
const newArray = array
newArray.push(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

Chcemy stworzyć funkcję, która doda nowy element do tablicy, a następnie zwróci tą tablicę.

Array.prototype.push() domyślnie zwraca długość tablicy tj. łączną liczbę elementów.

W addToArray() wyraźnie zwracamy więc zaktualizowaną tablicę.

Jakie elementy zostaną zalogowane do konsoli jako fruits i favFruits po użyciu funkcji addToArray()?

🧪 Rozwiązanie

function addToArray(item, array) {
const newArray = array.concat(item)

return newArray
}

const fruits = ["apple", "orange"]
const favFruits = addToArray("banana", fruits)

console.log({ fruits, favFruits })

W przykładzie z błędem okazuje się, że fruits i favFruits zwrócą ten sam zbiór 3 elementów ["apple", "orange", "banana"].

Powodem takiego efektu jest charakter działania metody push(). Mutuje ona tablicę, tj. zmienia jej oryginalną zawartość.

O funkcjach/metodach, które mają tego typu działanie, mówi się, że generują efekty uboczne. Jest to z reguły sytuacja niepożądana.

Dodatkową pułapką w błędnym kodzie, może być też fakt, że deklarujemy nową stałą newArray, komunikując chęć stworzenia kopi tablicy array.

W JavaScript odwoływanie do tablic odbywa się przez referencję, czyli przez adres, pod którym tablica została zapisana w pamięci RAM.

const newArray = array nie tworzy więc kopi tablicy, a jedynie alias (nową nazwę), wskazując na tą samą tablicę z pamięci.

Aby naprawić przykładowy kod, możemy użyć np. metody concat(), która nie generuje efektów ubocznych i zwraca nową tablicę.

Po takiej zamianie, fruits i favFruits zalogują do konsoli właściwe elementy z dwóch różnych tablic.

🎢 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