Przejdź do głównej zawartości

Bug #025

🪲 Znajdź buga

function sum(a, b) {
return a + b
}

function sum(a, b, c) {
return a + b + c
}

console.log(sum(1, 2))

Chcemy przeciążyć funkcję, tj. zdefiniować kolejną funkcję o tej samej nazwie, ale z innymi parametrami.

Jaki będzie efekt wywołania powyższego kodu?

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

function sum(a, b, c) {
return a + b + c
}

function sum(a, b) {
return a + b
}

console.log(sum(1, 2))

W błędnym przykładzie, wywołanie funkcji sum(1, 2) zaloguje do konsoli wartość NaN.

JavaScript w przeciwieństwie do innych języków np. C++, Java, Swift, nie pozwala na przeciążanie funkcji, czyli deklarowania ich używając tej samej nazwy funkcji ale z innymi parametrami.

Co ciekawe TypeScript zezwala na definiowanie funkcji przeciążających.

O ile przeciążanie funkcji nie jest możliwe w JavaScript, to nadpisywanie ich już jak najbardziej tak.

Nie dostajemy więc błędu o zdefiniowaniu funkcji z nazwą, która już istnieje, bo jest to dozwolone.

Do konsoli zostaje zalogowane NaN (skrót od Not-A-Number), bo JavaScript nie może wykonywać operacji matematycznych na typach danych innych niż Number.

Nadpisując funkcję sum(), nadpisujemy ją deklarując w jej nowej wersji trzy parametry.

Wywołując sum() przekazujemy tylko dwa argumenty. Trzeci, brakujący, używany wewnątrz funkcji jako parametr pozostaje niezdefiniowany.

Operacja wewnątrz funkcji 1 + 2 + undefined zwraca więc NaN.

Aby rozwiązać problem, najprościej będzie nam nadpisać funkcję w odwrotnej kolejności, lub kompletnie pozbyć się deklaracji funkcji sum() z trzema parametrami.

🎢 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