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
- Przeciążanie funkcji – Wikipedia, wolna encyklopedia
- Nadpisywanie metod – Wikipedia, wolna encyklopedia
- NaN - JavaScript | MDN
- TypeScript: Documentation - More on Functions
❤️ Podobają Ci się bugi JS?
Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js