Przejdź do głównej zawartości

Bug #011

🪲 Znajdź buga

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
case "writer":
permission = "can write"
case "admin":
permission = "can everything"
}

return permission
}

console.log(getUserPermission(loggedUser))

Co zostanie zalogowane do konsoli? Jakie pozwolenie będzie miał zalogowany użytkownik?

🧪 Rozwiązanie

const loggedUser = {
role: "reader",
}

function getUserPermission(user) {
let permission

switch (user.role) {
case "reader":
permission = "can read"
break
case "writer":
permission = "can write"
break
case "admin":
permission = "can everything"
break
}

return permission
}

console.log(getUserPermission(loggedUser))

W przykładzie z błędem, do konsoli zostanie zalogowane can everything. Mimo, że zalogowany użytkownik ma ustawioną rolę na reader, instrukcja switch nie zatrzyma swojego działania na tym przypadku i finalnie użytkownik uzyska prawa admina.

Dzieje się tak, ponieważ domyślnie switch zaczynając od przypadku w którym nastąpi dopasowanie, wykonuje kod aż do pojawienia się deklaracji break.

W naszym błędnym przykładzie nie dodaliśmy break w żadnym z przypadków (case), więc kod wykonywał się po kolei, kończąc na przypisaniu do zmiennej permission wartości z ostatniego przypadku w switch.

Innym rozwiązaniem, unikającym wystąpienia błędu, mogłoby być pominięcie zmiennej permission i bezpośrednie zwracanie pożądanych wartości w każdy z przypadków (return "can ...").

Nie musielibyśmy wtedy używać wyrażeń break, ponieważ po wywołaniu return, dalszy kod w funkcji nie byłby wykonywany.

🎢 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