JavaScript podstawy dla Java developera

TL;DR: JavaScript to dynamiczny język interpretowany działający w przeglądarce i na serwerze (Node.js). W przeciwieństwie do Javy nie ma statycznych typów, klasy definiuje się inaczej, a funkcje są obiektami pierwszej klasy. Składnia podobna do Javy ale semantyka bardzo różna – brak kompilacji, duck typing, prototype-based OOP.

Dlaczego Java developer powinien znać JavaScript?

Jako Java developer pracujesz głównie na backendzie, ale coraz częściej musisz rozumieć frontend. JavaScript jest językiem przeglądarek – każda aplikacja webowa go używa. Dodatkowo Node.js pozwala pisać backend w JS, więc warto znać podstawy żeby rozumieć całą aplikację.

Współczesne aplikacje to nie tylko Spring Boot + REST API. Frontend w Angular, React czy Vue.js komunikuje się z twoim backendem przez AJAX, a ty musisz rozumieć jak działają te zapytania i jakie dane frontend oczekuje.

Co się nauczysz:

  • Różnice między JavaScript a Java w składni i semantyce
  • Jak działają typy danych w JS vs statyczne typy w Javie
  • Podstawy obiektowości w JavaScript (prototypy vs klasy)
  • Funkcje jako obiekty pierwszej klasy – nowa koncepcja dla Java developera
  • Jak JavaScript komunikuje się z backendem przez AJAX
Wymagania wstępne: Dobra znajomość Javy, podstawy HTML. Nie musisz znać żadnych frameworków JS ani Node.js.

JavaScript vs Java – pierwsze wrażenia

Jeśli Java to niemiecki – ścisły, precyzyjny, wszystko ma swoje miejsce – to JavaScript to angielski. Łatwiejszy na start, ale pełen wyjątków i niuansów które odkrywasz z czasem.

Porównajmy prosty kod:

JavaJavaScript
public class User {
    private String name;
    
    public User(String name) {
        this.name = name;
    }
    
    public void sayHello() {
        System.out.println("Hello " + name);
    }
}
function User(name) {
    this.name = name;
}

User.prototype.sayHello = function() {
    console.log("Hello " + this.name);
}

// Lub w ES6 (2015):
class User {
    constructor(name) {
        this.name = name;
    }
    
    sayHello() {
        console.log("Hello " + this.name);
    }
}

Uwaga: JavaScript klasy (ES6) to tylko „cukier składniowy” nad prototypami. Pod spodem nadal działają prototypy, nie klasy jak w Javie.

Typy danych – największa różnica

W Javie wszystko ma typ określony w compile time. JavaScript ma typy, ale są dynamiczne:

// JavaScript - typy dynamiczne
var message = "Hello";        // string
message = 42;                 // teraz number
message = true;               // teraz boolean
message = null;               // teraz null
message = undefined;          // teraz undefined

// Podstawowe typy w JS:
var text = "Hello World";     // string
var number = 42;              // number (nie ma int/double)
var isActive = true;          // boolean
var nothing = null;           // null
var notDefined;               // undefined
var user = {name: "Jan"};     // object
var numbers = [1, 2, 3];      // object (array)
Typowy błąd Java developera: Próbowanie „myślenia typami” w JavaScript. JS ma duck typing – „jeśli chodzi jak kaczka i kwacze jak kaczka, to pewnie jest kaczką”.

Porównanie typów:

JavaJavaScriptUwagi
int, long, double, floatnumberJS ma tylko jeden typ liczbowy
StringstringPodobne, ale JS strings są immutable
booleanbooleanIdentyczne
nullnull, undefinedJS ma dwa „puste” typy
ObjectobjectJS objects to mapy klucz-wartość
ArrayArray (object)JS array to specjalny object

Funkcje – obiekty pierwszej klasy

To największa różnica dla Java developera. W JavaScript funkcje to obiekty – możesz je przypisywać do zmiennych, przekazywać jako parametry, zwracać z innych funkcji:

// Funkcja jako zmienna
var greet = function(name) {
    return "Hello " + name;
};

// Funkcja jako parametr (callback)
function processUser(user, callback) {
    console.log("Processing: " + user.name);
    callback(user);
}

processUser({name: "Jan"}, function(user) {
    console.log("Finished processing " + user.name);
});

// Arrow functions (ES6) - jak lambda w Java 8
var multiply = (a, b) => a * b;
var users = [{name: "Jan"}, {name: "Anna"}];
var names = users.map(user => user.name); // ["Jan", "Anna"]

Arrow functions w JavaScript (ES6) to odpowiednik lambda expressions w Java 8. Podobna składnia, podobne zastosowanie do funkcji wyższego rzędu.

Obiektowość – prototypy vs klasy

Java ma dziedziczenie klasowe, JavaScript ma dziedziczenie prototypowe:

// Prototype-based inheritance (tradycyjny JS)
function Animal(name) {
    this.name = name;
}

Animal.prototype.speak = function() {
    console.log(this.name + " makes a sound");
};

function Dog(name, breed) {
    Animal.call(this, name);  // Super constructor
    this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

Dog.prototype.speak = function() {
    console.log(this.name + " barks");
};

var dog = new Dog("Burek", "Labrador");
dog.speak(); // "Burek barks"
Pro tip: ES6 wprowadził składnię class, ale to nadal prototypy pod spodem. Dla Java developera class syntax jest bardziej znajomy, ale warto rozumieć prototypy.

Zmienne i scope – var, let, const

JavaScript ma trzy sposoby deklarowania zmiennych (w 2016 roku):

// var - function scope, hoisting
var x = 1;
function test() {
    var x = 2;  // Nowa zmienna lokalna
    console.log(x); // 2
}
test();
console.log(x); // 1

// let - block scope (ES6)
let y = 1;
if (true) {
    let y = 2;  // Nowa zmienna w bloku
    console.log(y); // 2
}
console.log(y); // 1

// const - stała (ES6)
const PI = 3.14159;
// PI = 3.14; // Error!

const user = {name: "Jan"};
user.name = "Anna"; // OK - można modyfikować właściwości
// user = {}; // Error - nie można przepisać referencji

Pułapka: var ma function scope, nie block scope jak w Javie. let i const (ES6) mają block scope bardziej podobny do Javy.

JSON i komunikacja z backendem

JavaScript Object Notation (JSON) to naturalny format dla JS:

// JavaScript object
var user = {
    id: 1,
    name: "Jan Kowalski",
    email: "jan@example.com",
    active: true
};

// Konwersja do JSON string
var jsonString = JSON.stringify(user);
console.log(jsonString); 
// {"id":1,"name":"Jan Kowalski","email":"jan@example.com","active":true}

// Parsowanie JSON string do object
var parsed = JSON.parse(jsonString);
console.log(parsed.name); // "Jan Kowalski"

// AJAX request do backend API
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/users/1');
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var user = JSON.parse(xhr.responseText);
        console.log('User name: ' + user.name);
    }
};
xhr.send();

AJAX – Asynchronous JavaScript and XML. Pozwala JavaScriptowi wysyłać requesty do serwera bez przeładowania strony. Dziś używa się głównie JSON zamiast XML.

Różnice w błędach i debugowaniu

Java ma compile-time errors, JavaScript ma tylko runtime errors:

// Ten kod się "skompiluje" ale wywali błąd w runtime
function calculateTotal(price, tax) {
    return price * tax.rate; // Co jeśli tax jest null?
}

calculateTotal(100, null); // TypeError: Cannot read property 'rate' of null

// Defensive programming jak w Javie
function calculateTotalSafe(price, tax) {
    if (!price || !tax || typeof tax.rate !== 'number') {
        throw new Error('Invalid parameters');
    }
    return price * tax.rate;
}

// Try-catch działa podobnie jak w Javie
try {
    var total = calculateTotalSafe(100, null);
} catch (error) {
    console.error('Error: ' + error.message);
}
Uwaga: JavaScript jest bardzo „wybaczający” – kod który w Javie nie przeszedłby kompilacji, w JS może działać nieprawidłowo ale bez błędu.

Podstawy DOM – manipulacja HTML

JavaScript w przeglądarce może modyfikować HTML:

// Znajdź element po ID
var button = document.getElementById('myButton');

// Dodaj event listener
button.addEventListener('click', function() {
    alert('Button clicked!');
});

// Modyfikuj treść elementu
var heading = document.querySelector('h1');
heading.textContent = 'New heading text';

// Dodaj nowy element
var newDiv = document.createElement('div');
newDiv.innerHTML = '

New paragraph

'; document.body.appendChild(newDiv); // Pobierz dane z formularza var form = document.forms['userForm']; var username = form.elements['username'].value; console.log('Username: ' + username);

Asynchroniczność – callbacks i promises

JavaScript jest single-threaded ale asynchroniczny:

// Callback pattern
function loadUser(userId, callback) {
    setTimeout(function() {
        // Symulacja AJAX request
        var user = {id: userId, name: 'Jan Kowalski'};
        callback(user);
    }, 1000);
}

loadUser(1, function(user) {
    console.log('Loaded user: ' + user.name);
});

// Promises (ES6) - lepsze niż callbacks
function loadUserPromise(userId) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            if (userId > 0) {
                resolve({id: userId, name: 'Jan Kowalski'});
            } else {
                reject(new Error('Invalid user ID'));
            }
        }, 1000);
    });
}

loadUserPromise(1)
    .then(function(user) {
        console.log('Loaded user: ' + user.name);
    })
    .catch(function(error) {
        console.error('Error: ' + error.message);
    });
Czy JavaScript jest podobny do Javy?

Tylko składnią. Semantyka jest bardzo różna – JavaScript ma dynamiczne typy, prototype-based OOP, funkcje pierwszej klasy. Nazwa to marketing z lat 90.

Czy muszę znać wszystkie dziwności JavaScript?

Na start nie. Naucz się podstaw, używaj linterów jak ESLint, trzymaj się modern JS (ES6+). Dziwności poznasz stopniowo gdy będą potrzebne.

Jak debugować JavaScript?

Browser DevTools (F12) to twój najlepszy przyjaciel. Console.log() zamiast System.out.println(), debugger statement zamiast breakpointów w IDE.

Czy Node.js to to samo co JavaScript w przeglądarce?

Ten sam język, inne środowisko. Przeglądarka ma DOM i Web APIs, Node.js ma file system i network APIs. Podstawy języka są identyczne.

Jak komunikować się z moim REST API w Spring Boot?

Przez AJAX requests (XMLHttpRequest lub fetch API). Wysyłasz JSON, odbierasz JSON. Twój @RestController zwraca dane, JS je parsuje i wyświetla.

Przydatne zasoby:

🚀 Zadanie dla Ciebie

Stwórz prostą stronę HTML z JavaScript która:

  • Ma formularz z polem na imię użytkownika
  • Po kliknięciu przycisku pobiera dane AJAX z endpointu /api/greeting
  • Wyświetla odpowiedź z serwera w div na stronie
  • Obsługuje błędy (try-catch, sprawdzenie statusu response)

Stwórz też prosty endpoint w Spring Boot który zwraca JSON z powitaniem. Przetestuj komunikację między JS a Javą.

Jakie są twoje pierwsze wrażenia z JavaScript? Czy składnia rzeczywiście przypomina Javę, czy różnice w semantyce są zbyt duże? Podziel się swoimi doświadczeniami z przejściem z Javy na JS!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry