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