Przejdź do głównej zawartości

Bug #057

🪲 Znajdź buga

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log(null || undefined ?? "foo")

Jakie wartości zostaną zalogowane do konsoli w powyższym przykładzie?

🧪 Rozwiązanie

console.log(null || undefined)
console.log(undefined || null)

console.log(null ?? "foo")
console.log(undefined ?? "foo")

console.log((null || undefined) ?? "foo")

W przykładzie z błędem, 7 linia wyrzuci do konsoli SyntaxError.

Treść błędu może się różnić w zależności od kontekstu, w którym kod zostanie wywołany.

W przypadku przekazania kodu jako argument do console.log(), dostaniemy informację o brakującym domknięciu nawiasu na liście argumentów.

SyntaxError sprowadza się jednak do niedozwolonej składni w języku JavaScript. Po prostu nie możemy użyć danej konstrukcji.

I taką niedozwoloną konstrukcją jest użycie operatora ?? na równi z operatorami || lub &&.

Po prostu nie możemy tego robić, musimy użyć nawiasów dla wyraźnego zgrupowania wyrażeń, które chcemy aby zostały wykonane w pierwszej kolejności.

Dokumentacja JavaScript od Mozilli (MDN), tłumaczy, że jednoczesne użycie ?? w połączeniu z || lub && mogłoby wprowadzać w kodzie błędy wynikające z wystąpienia zwarcia (short circuiting).

Warto zauważyć, że tabela priorytetów wykonywania operatorów plasuje && wyżej niż ||, ale ze względu na efekt zwarcia, który jeśli wystąpi, totalnie ignoruje drugi operand, co również może prowadzić do błędów w kodzie związanych z oczekiwaniem wywołania funkcji w takim wyrażeniu.

Przykładowo, przy wyrażeniu true || alert("bar") && false zadziała zwarcie na wartości true i cały dalszy kod nie zostanie wykonany, mimo że priorytet wykonywania operatorów mógłby sugerować, że funkcja alert("bar") powinna zostać wykonana w celu ewaluacji wartości operatora &&.

W tym kontekście, wyrzucanie błędu składniowego w momencie równoległego użycia ?? z && lub || wydaje się być naciągane.

🎢 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