Ten rozdział pokrótce podsumowuje cechy JavaScriptu, których nauczyliśmy się do tej pory, zwracając szczególną uwagę na drobne akcenty.
Instrukcje są rozdzielane średnikiem:
alert('Witaj'); alert('Świecie');Zwykle znak końca wiersza jest również traktowany jako separator, więc to działałby również:
alert('Witaj')
alert('Świecie')Nazywa się to „automatycznym wstawianiem średnika”. Czasami to jednak nie działa, na przykład:
alert("Po tej wiadomości wystąpi błąd")
[1, 2].forEach(alert)Większość wytycznych do stylów kodowania (ang. codestyle guides) twierdzi, że po każdym wyrażeniu należy umieścić średnik.
Średniki nie są wymagane po blokach kodu {...} i konstrukcjach składniowych ich używających jak pętle:
function f() {
// po deklaracji funkcji nie jest potrzebny średnik
}
for(;;) {
// po pętli nie jest potrzebny średnik
}... Ale nawet jeśli możemy gdzieś umieścić „dodatkowy” średnik, nie jest to błąd. Zostanie zignorowany.
Więcej w: info:structure.
Aby w pełni włączyć wszystkie funkcje współczesnego JavaScriptu, powinniśmy uruchamiać skrypty z deklaracją "use strict".
'use strict';
...Dyrektywa musi znajdować się na początku skryptu lub na początku treści funkcji.
Bez "use strict", wszystko nadal działa, ale niektóre funkcje zachowują się w staromodny," kompatybilny" sposób. Zwykle wolelibyśmy nowoczesne zachowanie.
Niektóre nowoczesne funkcje języka (takie jak klasy, których będziemy się uczyć w przyszłości) domyślnie włączają tryb ścisły.
Więcej w: info:strict-mode.
Mogą być zadeklarowane przy pomocy:
letconst(stała, nie można jej zmienić)var(staromodna, zobaczymy to później)
Nazwa zmiennej może zawierać:
- Litery i cyfry, ale pierwszy znak nie może być cyfrą.
- Znaki
$i_są wykorzystywane na równi z literami. - Alfabety inne niż łacińskie i hieroglify są również dozwolone, ale powszechnie nie są używane.
Zmienne są typowane dynamicznie. Mogą przechowywać dowolną wartość:
let x = 5;
x = "Jan";Istnieje 8 typów danych:
numberzarówno dla liczb zmiennoprzecinkowych, jak i całkowitych,bigintdla liczb całkowitych dowolnej wielkości,stringdla ciągów znaków,booleandla wartości logicznych (prawda/fałsz):true/false,null- typ przyjmujący tylko wartośćnull, znaczący "pusty" albo "nie istnieje",undefined- typ przyjmujący tylko wartośćundefined, znaczący "nieprzypisany",objectisymbol- wykorzystywany w złożonych strukturach danych i unikalnych identyfikatorach, ale jeszcze się ich nie nauczyliśmy.
Operator typeof zwraca typ wartości, z dwoma wyjątkami:
typeof null == "object" // wewnętrzny błąd w języku
typeof function(){} == "function" // funkcje są traktowane specjalnieWięcej w: info:variables i info:types.
Używamy przeglądarki jako środowiska pracy, więc podstawowe funkcje interfejsu użytkownika będą następujące:
prompt(pytanie, [wartość domyślna])
: Zadaje pytanie, i zwraca albo to, co wpisał użytkownik lub null jeżeli kliknął "anuluj".
confirm(pytanie)
: Zadaje pytanie i umożliwia wybór pomiędzy Ok i Anuluj. Wybór jest zwracany w postaci true/false.
alert(wiadomość)
: Wyświetla wiadomość.
Wszystkie te funkcje są modalne (w postaci okien dialogowych), wstrzymują wykonywanie kodu i uniemożliwiają odwiedzającemu interakcję ze stroną, dopóki nie odpowie.
Na przykład:
let userName = prompt("Twoje imię?", "Alicja");
let isTeaWanted = confirm("Chcesz herbaty?");
alert( "Odwiedzający: " + userName ); // Alicja
alert( "Potrzebna herbata: " + isTeaWanted ); // trueWięcej w: info:alert-prompt-confirm.
JavaScript obsługuje następujące operatory:
Arytmetyczne
: Zwyczajne: * + - /, oraz % dla reszty z dzielenia całkowitego i ** dla potęgi liczby.
Dwuargumentowy operator plus `+` łączy łańcuchy znaków. Jeżeli któryś z operandów jest napisem, drugi jest również konwertowany na napis:
```js run
alert( '1' + 2 ); // '12', string
alert( 1 + '2' ); // '12', string
```
Przypisania
: Isnieje proste przypisanie: a = b i złożone, takie jak a *= 2.
Bitowe : Operatory bitowe działają z 32-bitowymi liczbami całkowitymi na najniższym poziomie bitowym: zobacz dokumentację kiedy są wykorzystywane.
Warunkowy
: Jedyny operator z trzeba parametrami: warunek ? wynikA : wynikB. Jeżeli warunek jest prawdziwy, zwraca wynikA, w przeciwnym wypadku wynikB.
Operatory logiczne
: Logiczne ORAZ (ang. AND) && i LUB (ang. OR) || wykonują ewaluację w postaci "zwarcia" (ang. short-circuit evaluation) a następnie zwracacją wartość w miejscu, w którym została zatrzymana (niekoniecznietrue/false). Logiczne NIE (ang. NOT) ! Konwertuje operand na typ boolowski i zwraca wartość odwrotną.
Operator nullish coalescing
: Operator ?? umożliwia wybranie zdefiniowanej wartości z listy zmiennych. Wynikiem a ?? b jest a, chyba że a jest null/undefined, w takim przypadku wynikiem jest b.
Porównania
: Sprawdzanie równości == dla wartości różnych typów konwertuje je na liczbę (z wyjątkiem null i undefined które są sobie równe i nic więcej), więc poniższe porównania są równe:
```js run
alert( 0 == false ); // true
alert( 0 == '' ); // true
```
Inne porównania również konwertują na liczbę.
Operator ścisłej równości `===` nie wykonuje konwersji: różne typy w tym przypadku zawsze oznaczają różne wartości.
Wartości `null` i `undefined` są specjalne: są równe `==` sobie nawzajem i nie są równe niczemu innemu.
Większe / mniejsze porównania porównują łańcuchy znak po znaku, inne typy są konwertowane na liczbę.
Inne operatory : Jest kilka innych, takich jak operator przecinka.
Więcej w: info:operators, info:comparison, info:logical-operators.
-
Omówiliśmy 3 rodzaje pętli:
// 1 while (warunek) { ... } // 2 do { ... } while (warunek); // 3 for(let i = 0; i < 10; i++) { ... }
-
Zmienna zadeklarowana w pętli
for(let...)jest widoczna tylko wewnątrz pętli. Ale możemy też pominąćleti ponownie użyć istniejącej zmiennej. -
Dyrektywy
break/continuepozwalają na wyjście z całej pętli / bieżącej iteracji. Użyj etykiet, aby przerwać zagnieżdżone pętle.
Szczegóły w: info:while-for.
Później zbadamy więcej typów pętli do radzenia sobie z obiektami.
Konstrukcja "switch" może zastąpić wiele sprawdzeń przy pomocy if. Do porównań używa === (ścisła równość).
Na przykład:
let age = prompt('Twój wiek?', 18);
switch (age) {
case 18:
alert("Nie zadziała"); // wynikiem "prompt" jest ciąg znaków a nie liczba
case "18":
alert("To działa!");
break;
default:
alert("Każda wartość nie równa tej powyższej");
}Szczegóły w: info:switch.
Omówiliśmy trzy sposoby tworzenia funkcji w JavaScript:
-
Function Declaration: funkcja w głównym przepływie kodu (ang. code flow)
function sum(a, b) { let result = a + b; return result; }
-
Function Expression: funkcja w kontekście wyrażenia
let sum = function(a, b) { let result = a + b; return result; };
-
Funkcje strzałkowe:
// wyrażenie po prawej stronie let sum = (a, b) => a + b; // albo składnia wielowierszowa z { ... }, potrzeba tutaj użyć return: let sum = (a, b) => { // ... return a + b; } // bez argumentów let sayHi = () => alert("Hello"); // z jednym argumentem let double = n => n * 2;
- Funkcje mogą mieć zmienne lokalne: te zadeklarowane w treści lub na liście parametrów. Takie zmienne są widoczne tylko wewnątrz funkcji.
- Parametry mogą mieć wartości domyślne:
function sum(a = 1, b = 2) {...}. - Funkcje zawsze coś zwracają. Jeśli nie ma instrukcji
returnwynikiem jestundefined.
Szczegóły: zobacz info:function-basics, info:arrow-functions-basics.
To była krótka lista funkcji JavaScript. Na razie uczyliśmy się tylko podstaw. W dalszej części samouczka znajdziesz więcej specjalnych i zaawansowanych funkcji JavaScript.