Kurs JavaScript i TypeScript · Moduł 1: Podstawy JavaScript
Średniki i ich opcjonalność
W tej lekcji9
W Parku Jurajskim istnieją protokoły bezpieczeństwa, które muszą być bezwzględnie przestrzegane, ale są też takie, które czasem można elastycznie interpretować w zależności od sytuacji. Podobna sytuacja występuje w JavaScript ze średnikami - czasem są absolutnie konieczne, a innym razem kompletnie opcjonalne.
Rola średników w JavaScript
Średniki (;) służą do oddzielania instrukcji w JavaScript. To jak bramy bezpieczeństwa między poszczególnymi procedurami w Parku Jurajskim - wyraźnie zaznaczają, gdzie kończy się jedna operacja, a zaczyna kolejna.
1let velociraptorCount = 3; // Pierwsza instrukcja
2velociraptorCount = velociraptorCount + 2; // Druga instrukcja
3console.log("Liczba velociraptorów: " + velociraptorCount); // Trzecia instrukcjaKiedy średniki są opcjonalne?
JavaScript posiada mechanizm nazywany "Automatic Semicolon Insertion" (ASI), czyli automatyczne wstawianie średników. Mechanizm ten pozwala na pomijanie średników w wielu przypadkach, gdyż JavaScript inteligentnie domyśla się, gdzie powinny się znajdować.
To jak sytuacja w Parku Jurajskim, gdy doświadczeni treserzy dinozaurów mogą czasem pominąć niektóre kroki procedury, bo wiedzą, jak się bezpiecznie zachować.
1// Kod bez średników - ASI wstawi je automatycznie
2let trexWeight = 8000
3console.log("Waga T-Rexa: " + trexWeight)W powyższym przykładzie JavaScript interpretuje kod tak, jakby wyglądał następująco:
1let trexWeight = 8000;
2console.log("Waga T-Rexa: " + trexWeight);Jak działa ASI?
ASI (Automatic Semicolon Insertion) działa według kilku zasad, które warto rozumieć.
1. ASI działa na końcu linii
JavaScript wstawia średnik automatycznie, gdy napotka znak nowej linii (newline), jeśli uważa, że instrukcja powinna się w tym miejscu zakończyć:
1let dinoName = "Velociraptor" // ASI wstawi średnik tutaj
2let dinoHeight = 0.5 // ASI wstawi średnik tutaj2. ASI kończy instrukcję po return, gdy dalej jest nowa linia
Po słowach return, break, continue i throw JavaScript nie szuka dalszego ciągu w następnej linii, tylko od razu wstawia średnik:
1function checkDinosaur() {
2 return // ASI wstawi średnik tutaj
3 {
4 species: "T-Rex"
5 }
6}Uwaga! W powyższym przykładzie ASI spowoduje, że funkcja zwróci undefined, a nie obiekt, jak można by oczekiwać. Aby uniknąć takich nieoczekiwanych rezultatów, należałoby napisać:
1function checkDinosaur() {
2 return {
3 species: "T-Rex",
4 dangerous: true
5 };
6}3. ASI nie zadziała, jeśli linia kończy się operatorem
Jeśli linia kończy się operatorem (np. +, -, *), JavaScript zakłada, że instrukcja jest kontynuowana w następnej linii:
1let longMessage = "Dinozaury w Parku Jurajskim " +
2 "są stale monitorowane" // ASI nie wstawi średnika po pierwszej liniiNiebezpieczeństwa związane z ASI
Podobnie jak nieprzestrzeganie procedur w Parku Jurajskim może prowadzić do nieszczęśliwych wypadków, tak poleganie wyłącznie na ASI może powodować nieoczekiwane błędy. Oto kilka sytuacji, w których ASI może działać inaczej, niż byśmy oczekiwali:
1. Rozpoczynanie linii od nawiasów
1let a = 5
2(function() {
3 console.log("Ta funkcja zostanie wywołana natychmiast!")
4})()JavaScript zinterpretuje to jako:
1let a = 5(function() {
2 console.log("Ta funkcja zostanie wywołana natychmiast!")
3})();Co spowoduje błąd, ponieważ 5 nie jest funkcją. Prawidłowy zapis to:
1let a = 5;
2(function() {
3 console.log("Ta funkcja zostanie wywołana natychmiast!")
4})();2. Rozpoczynanie linii od operatorów [ lub +
1let dinosaurs = ['T-Rex', 'Velociraptor']
2['Triceratops', 'Brachiosaurus'].forEach(function(dino) {
3 console.log(dino)
4})JavaScript może zinterpretować to jako próbę dostępu do tablicy dinosaurs z użyciem indeksu ['Triceratops', 'Brachiosaurus'], co spowoduje błąd. Prawidłowy zapis:
1let dinosaurs = ['T-Rex', 'Velociraptor'];
2['Triceratops', 'Brachiosaurus'].forEach(function(dino) {
3 console.log(dino)
4});Dobre praktyki
W świecie JavaScript istnieją dwie szkoły myślenia na temat średników, podobnie jak w Parku Jurajskim są różne podejścia do zarządzania dinozaurami:
Podejście "zawsze używaj średników"
To jak przestrzeganie wszystkich procedur bezpieczeństwa w parku, nawet jeśli niektóre wydają się nadmiarowe:
- Zawsze stawiaj średniki na końcu instrukcji
- Unikasz potencjalnych pułapek związanych z ASI
- Kod jest bardziej czytelny i przewidywalny
- Łatwiej współpracuje się z innymi programistami
1// Kod ze średnikami
2let parkStatus = "Otwarte";
3let visitorCount = 1500;
4
5function updateStatus(newStatus) {
6 parkStatus = newStatus;
7 return parkStatus;
8}
9
10updateStatus("Zamknięte ze względów bezpieczeństwa");
11console.log("Aktualny status: " + parkStatus);Podejście "opieraj się na ASI"
To jak pozwalanie doświadczonym trenerom na pewną swobodę w pracy z dinozaurami:
- Polegaj na automatycznym wstawianiu średników
- Unikaj "wizualnego szumu" w kodzie
- Stosuj się do wytycznych stylu (np. Standard JS)
- Uważaj na potencjalne pułapki
1// Kod bez średników
2let parkStatus = "Otwarte"
3let visitorCount = 1500
4
5function updateStatus(newStatus) {
6 parkStatus = newStatus
7 return parkStatus
8}
9
10updateStatus("Zamknięte ze względów bezpieczeństwa")
11console.log("Aktualny status: " + parkStatus)Zasady bezpiecznego pomijania średników
Jeśli zdecydujesz się na pomijanie średników, oto kilka zasad bezpieczeństwa (jak protokoły bezpieczeństwa w Parku Jurajskim):
- Nigdy nie rozpoczynaj linii od
(,[lub/(to znaki niebezpieczne dla ASI):
1// ŹLE - potencjalna pułapka:
2let greeting = "Witaj w Parku Jurajskim"
3(function() {
4 console.log(greeting)
5})()
6
7// DOBRZE - dodaj średnik przed IIFE:
8let greeting = "Witaj w Parku Jurajskim";
9(function() {
10 console.log(greeting)
11})()
12
13// LUB - postaw średnik na początku linii (średnik obronny):
14let greeting = "Witaj w Parku Jurajskim"
15;(function() {
16 console.log(greeting)
17})()- Uważaj na instrukcje
return,break,continue,throwna końcu linii:
1// ŹLE - ASI wstawi średnik po return:
2function getDinosaurData() {
3 return
4 {
5 name: "T-Rex"
6 }
7}
8
9// DOBRZE - nawias klamrowy w tej samej linii co return:
10function getDinosaurData() {
11 return {
12 name: "T-Rex",
13 weight: 8000
14 }
15}- Bądź konsekwentny w swoim podejściu:
Jak w zarządzaniu parkiem - albo wszystkie procedury są przestrzegane, albo żadna. Mieszanie stylów prowadzi do chaosu i błędów.
Narzędzia pomocne w zarządzaniu średnikami
Podobnie jak w Parku Jurajskim używa się zaawansowanych narzędzi do monitorowania dinozaurów, tak w JavaScript mamy narzędzia pomagające w zarządzaniu kodem:
- ESLint - pozwala na wymuszenie konsekwentnego użycia lub nieużywania średników
1// W pliku .eslintrc.json:
2{
3 "rules": {
4 "semi": ["error", "always"] // lub "never" dla stylu bez średników
5 }
6}- Prettier - automatycznie formatuje kod, dodając lub usuwając średniki zgodnie z konfiguracją
1// W pliku .prettierrc:
2{
3 "semi": true // lub false dla stylu bez średników
4}Co wybrać?
Wybór między używaniem a pomijaniem średników w JavaScript przypomina decyzję o stylu zarządzania w Parku Jurajskim - bardziej formalne przestrzeganie procedur czy elastyczne podejście oparte na doświadczeniu.
- Używanie średników jest bezpieczniejsze, szczególnie dla początkujących i większych zespołów
- Pomijanie średników może działać w małych zespołach z jasno określonymi standardami
W profesjonalnym kodzie JavaScript najważniejsza jest konsekwencja - albo wszędzie używasz średników, albo nigdzie. Mieszanie stylów prowadzi do chaosu i błędów, podobnie jak niekonsekwentne przestrzeganie protokołów bezpieczeństwa w parku pełnym dinozaurów prowadziłoby do katastrofy.
Ostatecznie, jak powiedział dr Ian Malcolm w Parku Jurajskim: "Twoi programiści byli tak zajęci myśleniem, czy mogą pominąć średniki, że nie zastanowili się, czy powinni."
Podsumowanie
- Średniki w JavaScript służą do oddzielania instrukcji
- ASI (Automatic Semicolon Insertion) pozwala na pomijanie średników w wielu sytuacjach
- Istnieją pułapki ASI, szczególnie przy rozpoczynaniu linii od
(,[lub/i przyreturnna końcu linii - Wybierz jeden styl i stosuj go konsekwentnie w całym kodzie
- Narzędzia takie jak ESLint i Prettier pomagają utrzymać konsekwentny styl
W następnej lekcji przyjrzymy się deklaracji zmiennych w JavaScript, gdzie poznamy var, let i const - różne sposoby oznaczania i zabezpieczania naszych danych, podobnie jak różne poziomy zabezpieczeń dla różnych gatunków dinozaurów w Parku Jurajskim.
Kod do tej lekcji: index.js
1// System Bezpieczeństwa - Instrukcje Warunkowe
2// Ćwiczenie: Używanie if, else if, else
3
4// Prosty warunek
5const securityLevel = 3;
6
7if (securityLevel >= 5) {
8 console.log("ALARM! Poziom krytyczny!");
9} else if (securityLevel >= 3) {
10 console.log("UWAGA! Podwyższone zagrożenie.");
11} else {
12 console.log("Poziom normalny.");
13}
14
15// Operator porównania
16const fenceVoltage = 10000;
17const requiredVoltage = 8000;
18
19if (fenceVoltage >= requiredVoltage) {
20 console.log("Ogrodzenie: AKTYWNE");
21} else {
22 console.log("Ogrodzenie: AWARIA!");
23}
24
25// Twoje zadanie:
26// 1. Napisz warunek sprawdzający temperaturę inkubatora
27// 2. Użyj else if dla różnych zakresów
28// 3. Wyświetl odpowiedni komunikat
29
30// Twój kod tutaj:
31Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Który znak kończy instrukcję w JavaScript?
2. Czy średnik na końcu instrukcji w JavaScript jest obowiązkowy?
3. Co oznacza skrót ASI w kontekście JavaScript?
4. Co zwróci funkcja, w której return jest w osobnej linii niż zwracany obiekt? function f() { return { name: 'Rex' } }
Zadania praktyczne w grze
- Edytor kodu
Napisz program systemu monitorowania, który wyświetla w konsoli trzy komunikaty, np. 'Ogrodzenia: OK', 'Kamery: OK' i 'Zasilanie: 98%'. Każde console.log() zapisz w osobnej linii i zakończ średnikiem. Na górze dodaj komentarz wieloliniowy z opisem programu, a nad każdym console.log() komentarz jednoliniowy z wyjaśnieniem.