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