Web Development

JavaScript untuk Pemula: Panduan Lengkap

Belajar JavaScript dari nol — variabel, tipe data, fungsi, DOM manipulation, events, arrays, objects, async/await, dan Fetch API untuk membangun website interaktif

1. Pengenalan JavaScript

JavaScript adalah bahasa pemrograman yang menjadi tulang punggung interaktivitas di web. Bersama dengan HTML (struktur) dan CSS (tampilan), JavaScript membentuk trio teknologi inti yang dibutuhkan untuk membangun website modern.

JavaScript pertama kali dibuat oleh Brendan Eich di Netscape pada tahun 1995 dalam waktu hanya 10 hari. Sejak itu, JavaScript telah berevolusi menjadi bahasa pemrograman yang sangat powerful — tidak hanya untuk frontend, tapi juga untuk backend (Node.js), mobile (React Native), desktop (Electron), dan bahkan IoT.

Apa yang Bisa Dilakukan JavaScript?

Kemampuan Contoh
Manipulasi DOMMengubah teks, warna, ukuran elemen HTML secara dinamis
Event HandlingMerespon klik mouse, input keyboard, scroll, dan gesture sentuhan
AJAX / FetchMengambil data dari server tanpa reload halaman (SPA)
Validasi FormMemvalidasi input pengguna sebelum dikirim ke server
AnimasiMembuat animasi dan transisi interaktif di halaman
StorageMenyimpan data di browser (localStorage, sessionStorage)
Full-StackBackend development dengan Node.js dan Express.js

Cara Menggunakan JavaScript

HTML — 3 Cara JavaScript
<!-- 1. Inline JavaScript (langsung di atribut) — Tidak direkomendasikan -->
<button onclick="alert('Hello!')">Klik Saya</button>

<!-- 2. Internal JavaScript (di <script> tag) -->
<script>
    console.log('Hello World!');
    document.title = 'Halaman Baru';
</script>

<!-- 3. External JavaScript (file .js terpisah) — Paling direkomendasikan -->
<script src="app.js"></script>

<!-- Tips: gunakan defer untuk load selesai setelah HTML -->
<script src="app.js" defer></script>

Console: Tempat Eksperimen

JavaScript — Console
// Buka Developer Tools (F12) → Tab Console

// Mencetak teks ke console
console.log('Hello World!');
console.log('Nama saya:', 'Beebane');

// Peringatan
console.warn('Ini peringatan!');
console.error('Ini error!');

// Menghitung waktu eksekusi
console.time('loop');
for (let i = 0; i < 1000000; i++) {}
console.timeEnd('loop'); // → loop: 5.2ms

// Alert (popup di browser)
alert('Selamat datang di tutorial JavaScript!');
💡 Tips Belajar

Gunakan Console browser (F12 → Console) untuk langsung mencoba kode JavaScript tanpa perlu membuat file. Ini cara tercepat untuk bereksperimen dan menguji kode!

2. Variabel & Tipe Data

Variabel adalah wadah untuk menyimpan data. Di JavaScript modern, ada tiga cara mendeklarasikan variabel: let, const, dan var.

Deklarasi Variabel

JavaScript — Variabel
// ===== let: bisa diubah nilainya =====
let nama = 'Beebane';
nama = 'BeebaneLabs';  // ✅ Boleh diubah
console.log(nama);     // → 'BeebaneLabs'

// ===== const: TIDAK bisa diubah nilainya =====
const PI = 3.14159;
// PI = 3.14;  // ❌ Error! Assignment to constant variable
console.log(PI);  // → 3.14159

// ===== var: cara lama (hindari penggunaan) =====
var umur = 25;    // ⚠️ Punya function scope, bukan block scope

// ===== Naming Rules =====
// ✅ Valid:
let namaLengkap = 'John';     // camelCase (direkomendasikan)
let _privateVar = true;       // underscore prefix
let $hargaBarang = 50000;     // dollar prefix

// ❌ Invalid:
// let 2nama = 'error';      // Tidak boleh angka di awal
// let nama-lengkap = 'err';  // Tidak boleh dash
// let class = 'error';       // Tidak boleh reserved word

Tipe Data JavaScript

JavaScript — Data Types
// ===== PRIMITIVE TYPES =====

// 1. String (teks)
let teks = 'Hello World';
let teks2 = "Ini juga string";
let teks3 = `Template literal: ${teks}`;  // Backtick

// 2. Number (angka — integer dan decimal)
let umur = 25;
let harga = 99.99;
let negatif = -10;
let infinity = Infinity;
let notANumber = NaN;  // Hasil dari operasi yang gagal

// 3. Boolean (true/false)
let isActive = true;
let isLoggedIn = false;

// 4. Undefined (belum diberi nilai)
let belumDiisi;
console.log(belumDiisi);  // → undefined

// 5. Null (sengaja dikosongkan)
let dataKosong = null;

// 6. Symbol (unique identifier — jarang untuk pemula)
let id = Symbol('unique');

// 7. BigInt (angka sangat besar)
let bigNumber = 9007199254740991n;

// ===== Cek Tipe Data =====
console.log(typeof 'Hello');    // → "string"
console.log(typeof 42);        // → "number"
console.log(typeof true);      // → "boolean"
console.log(typeof undefined); // → "undefined"
console.log(typeof null);      // → "object" (bug lama di JS)
console.log(typeof [1,2,3]);   // → "object"

Operator

JavaScript — Operators
// ===== Aritmatika =====
let a = 10, b = 3;
console.log(a + b);   // 13 (penjumlahan)
console.log(a - b);   // 7  (pengurangan)
console.log(a * b);   // 30 (perkalian)
console.log(a / b);   // 3.33 (pembagian)
console.log(a % b);   // 1  (sisa bagi / modulus)
console.log(a ** b);   // 1000 (pangkat)

// ===== Perbandingan =====
console.log(5 == '5');    // true  (loose equality — mengkonversi tipe)
console.log(5 === '5');   // false (strict equality — cek tipe juga)
console.log(5 != '5');    // false
console.log(5 !== '5');   // true
console.log(10 > 5);     // true
console.log(10 <= 10);   // true

// ===== Logical =====
console.log(true && false);  // false (AND — keduanya harus true)
console.log(true || false);   // true  (OR — salah satu true)
console.log(!true);           // false (NOT — membalik nilai)

// ===== Template Literal =====
let nama = 'Beebane';
let umur = 25;
console.log(`Nama: ${nama}, Umur: ${umur} tahun`);
// → "Nama: Beebane, Umur: 25 tahun"

3. Fungsi (Functions)

Fungsi adalah blok kode yang dirancang untuk melakukan tugas tertentu. Fungsi bisa dipanggil berkali-kali, menerima input (parameter), dan mengembalikan output (return value). Ini adalah konsep paling penting dalam pemrograman.

Jenis-Jenis Fungsi

JavaScript — Functions
// ===== 1. Function Declaration =====
function sapaan(nama) {
    return `Halo, ${nama}! Selamat datang.`;
}
console.log(sapaan('Beebane'));  // → "Halo, Beebane! Selamat datang."

// ===== 2. Function Expression =====
const tambah = function(a, b) {
    return a + b;
};
console.log(tambah(5, 3));  // → 8

// ===== 3. Arrow Function (ES6 — modern) =====
const kali = (a, b) => {
    return a * b;
};

// Arrow function satu baris (implicit return)
const bagi = (a, b) => a / b;
const kuadrat = x => x * x;

console.log(kali(4, 5));    // → 20
console.log(bagi(10, 2));   // → 5
console.log(kuadrat(7));    // → 49

// ===== 4. Default Parameters =====
function buatUser(nama, role = 'member') {
    return { nama, role };
}
console.log(buatUser('Beebane'));           // { nama: 'Beebane', role: 'member' }
console.log(buatUser('Admin', 'admin'));    // { nama: 'Admin', role: 'admin' }

// ===== 5. Rest Parameters (...args) =====
function jumlahkan(...angka) {
    return angka.reduce((total, n) => total + n, 0);
}
console.log(jumlahkan(1, 2, 3, 4, 5));  // → 15

// ===== 6. Callback Function =====
function prosesData(data, callback) {
    const hasil = data.toUpperCase();
    callback(hasil);
}
prosesData('hello world', (hasil) => {
    console.log(hasil);  // → "HELLO WORLD"
});

// ===== 7. Immediately Invoked Function (IIFE) =====
(function() {
    const pesan = 'Kode ini langsung dijalankan!';
    console.log(pesan);
})();

Closures

JavaScript — Closure
// Closure: fungsi yang "mengingat" variabel dari lingkup luarnya
function buatCounter() {
    let count = 0;  // Variabel ini "tertangkap" oleh inner function

    return function() {
        count++;
        return count;
    };
}

const counter = buatCounter();
console.log(counter());  // → 1
console.log(counter());  // → 2
console.log(counter());  // → 3
// count tidak bisa diakses dari luar — tapi inner function tetap bisa!

4. DOM Manipulation

DOM (Document Object Model) adalah representasi struktur HTML dalam bentuk objek yang bisa dimanipulasi oleh JavaScript. Melalui DOM, JavaScript bisa membaca, mengubah, menambah, dan menghapus elemen HTML secara dinamis.

Diagram: DOM Tree Structure
  document
    └── html
        ├── head
        │   ├── title
        │   └── meta
        └── body
            ├── header
            │   └── nav
            │       └── ul
            │           ├── li → a
            │           ├── li → a
            │           └── li → a
            ├── main
            │   ├── h1
            │   └── p
            └── footer
                └── p

  JavaScript bisa mengakses SETIAP node di tree ini!

Memilih Elemen (Selectors)

JavaScript — DOM Selectors
// ===== getElementById — pilih berdasarkan ID =====
const header = document.getElementById('header');

// ===== querySelector — pilih dengan selector CSS (elemen pertama) =====
const judul = document.querySelector('h1');
const card = document.querySelector('.card');
const btnKirim = document.querySelector('#btn-kirim');
const emailInput = document.querySelector('input[type="email"]');

// ===== querySelectorAll — pilih semua yang cocok (NodeList) =====
const semuaParagraf = document.querySelectorAll('p');
const semuaCard = document.querySelectorAll('.card');

// Iterasi NodeList
semuaParagraf.forEach((p, index) => {
    console.log(`Paragraf ${index}:`, p.textContent);
});

// ===== getElementByClassName — HTMLCollection (live) =====
const items = document.getElementsByClassName('item');

// ===== getElementsByTagName =====
const semuaDiv = document.getElementsByTagName('div');

Mengubah Konten & Atribut

JavaScript — Modify DOM
const judul = document.querySelector('h1');

// ===== Mengubah Teks =====
judul.textContent = 'Judul Baru';          // Teks murni (aman)
judul.innerHTML = 'Judul <em>baru</em>';  // Bisa HTML (hati-hati XSS)

// ===== Mengubah Style =====
judul.style.color = '#2563eb';
judul.style.fontSize = '2rem';
judul.style.backgroundColor = '#f0f0f0';
judul.style.padding = '1rem';

// ===== Mengubah Class =====
judul.classList.add('active');         // Tambah class
judul.classList.remove('hidden');      // Hapus class
judul.classList.toggle('dark-mode');   // Toggle class
judul.classList.replace('old', 'new'); // Ganti class

if (judul.classList.contains('active')) {
    console.log('Judul sedang aktif!');
}

// ===== Mengubah Atribut =====
const gambar = document.querySelector('img');
gambar.setAttribute('src', 'foto-baru.jpg');
gambar.setAttribute('alt', 'Deskripsi baru');
gambar.removeAttribute('hidden');

const link = document.querySelector('a');
console.log(link.getAttribute('href'));  // Baca atribut

// ===== Mengubah Dataset (data-*) =====
// HTML: <div data-id="123" data-type="premium"></div>
const el = document.querySelector('div');
console.log(el.dataset.id);    // → "123"
console.log(el.dataset.type);  // → "premium"
el.dataset.status = 'active';  // Tambah data-status="active"

Membuat & Menghapus Elemen

JavaScript — Create & Remove
// ===== Membuat Elemen Baru =====
const kartu = document.createElement('div');
kartu.className = 'card';
kartu.innerHTML = `
    <h3>Judul Kartu</h3>
    <p>Ini adalah kartu baru yang dibuat dengan JavaScript.</p>
    <button onclick="hapusKartu(this)">Hapus</button>
`;

// Menambahkan ke DOM
const container = document.querySelector('.container');
container.appendChild(kartu);           // Di akhir
container.insertBefore(kartu, judul);   // Sebelum elemen tertentu
container.prepend(kartu);              // Di awal

// Modern method (lebih fleksibel)
container.append(kartu, kartu2, kartu3);  // Bisa banyak elemen
judul.after(kartu);                       // Setelah judul
judul.before(kartu);                      // Sebelum judul

// ===== Menghapus Elemen =====
kartu.remove();  // Modern (sederhana)
container.removeChild(kartu);  // Lama

5. Events (Event Handling)

Event adalah aksi yang terjadi di browser — seperti klik tombol, input keyboard, scroll halaman, atau submit form. JavaScript bisa "mendengarkan" event-event ini dan meresponsnya dengan menjalankan kode tertentu.

Event Listeners

JavaScript — Events
// ===== addEventListener (direkomendasikan) =====
const tombol = document.querySelector('#btn-kirim');

tombol.addEventListener('click', function(event) {
    console.log('Tombol diklik!');
    console.log('Target:', event.target);
    console.log('Posisi:', event.clientX, event.clientY);
});

// ===== Event Types yang Umum =====

// Click
tombol.addEventListener('click', () => console.log('Click!'));

// Double click
tombol.addEventListener('dblclick', () => console.log('Double click!'));

// Mouse events
tombol.addEventListener('mouseenter', () => console.log('Mouse masuk'));
tombol.addEventListener('mouseleave', () => console.log('Mouse keluar'));

// Keyboard events
document.addEventListener('keydown', (e) => {
    console.log(`Key: ${e.key}, Code: ${e.code}`);
    if (e.key === 'Escape') {
        closeModal();
    }
    if (e.key === 'Enter') {
        submitForm();
    }
});

// Input events
const input = document.querySelector('#search');
input.addEventListener('input', (e) => {
    console.log('Nilai:', e.target.value);
    // Cocok untuk real-time search / filter
});

// Focus & Blur
input.addEventListener('focus', () => console.log('Input aktif'));
input.addEventListener('blur', () => console.log('Input tidak aktif'));

// Scroll
window.addEventListener('scroll', () => {
    console.log('Scroll Y:', window.scrollY);
});

// Form submit
const form = document.querySelector('form');
form.addEventListener('submit', (e) => {
    e.preventDefault();  // Mencegah reload halaman!
    const formData = new FormData(form);
    console.log(Object.fromEntries(formData));
});

Event Delegation

JavaScript — Event Delegation
// ❌ Tidak efisien: listener pada setiap item
document.querySelectorAll('.item').forEach(item => {
    item.addEventListener('click', handleItemClick);
});

// ✅ Event Delegation: satu listener pada parent
const list = document.querySelector('.item-list');
list.addEventListener('click', (event) => {
    const item = event.target.closest('.item');
    if (!item) return;  // Klik bukan pada item

    console.log('Item diklik:', item.textContent);
    console.log('Index:', item.dataset.index);
});

// Keuntungan: elemen yang ditambahkan secara dinamis
// tetap bisa ditangkap tanpa perlu listener baru!

6. Arrays

Array adalah struktur data yang menyimpan kumpulan nilai dalam satu variabel. Array di JavaScript sangat fleksibel — bisa menyimpan tipe data berbeda, bisa berubah ukurannya, dan memiliki banyak method built-in yang powerful.

Membuat & Mengakses Array

JavaScript — Array Basics
// Membuat array
const buah = ['apel', 'jeruk', 'mangga', 'pisang'];
const angka = [1, 2, 3, 4, 5];
const campuran = ['teks', 42, true, null, { nama: 'Beebane' }];

// Mengakses elemen (index mulai dari 0)
console.log(buah[0]);    // → 'apel'
console.log(buah[2]);    // → 'mangga'
console.log(buah.length); // → 4

// Mengubah elemen
buah[1] = 'anggur';

// Menambah elemen
buah.push('semangka');      // Tambah di akhir
buah.unshift('strawberry'); // Tambah di awal

// Menghapus elemen
buah.pop();                 // Hapus terakhir
buah.shift();               // Hapus pertama
buah.splice(1, 1);          // Hapus 1 elemen di index 1

Array Methods (Modern ES6+)

JavaScript — Array Methods
const angka = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// ===== map: transformasi setiap elemen =====
const kuadrat = angka.map(n => n * n);
// → [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

const namaList = ['bee', 'bane', 'labs'];
const uppercased = namaList.map(n => n.toUpperCase());
// → ['BEE', 'BANE', 'LABS']

// ===== filter: ambil elemen yang memenuhi syarat =====
const genap = angka.filter(n => n % 2 === 0);
// → [2, 4, 6, 8, 10]

const besar = angka.filter(n => n > 5);
// → [6, 7, 8, 9, 10]

// ===== reduce: akumulasi menjadi satu nilai =====
const total = angka.reduce((acc, n) => acc + n, 0);
// → 55

const max = angka.reduce((max, n) => n > max ? n : max, angka[0]);
// → 10

// ===== find: cari elemen pertama yang cocok =====
const cari = angka.find(n => n > 5);
// → 6

// ===== some & every =====
angka.some(n => n > 8);   // → true (ada yang lebih dari 8)
angka.every(n => n > 0);  // → true (semua lebih dari 0)

// ===== sort =====
const huruf = ['c', 'a', 'b'];
huruf.sort();  // → ['a', 'b', 'c']

const produk = [
    { nama: 'Laptop', harga: 12000000 },
    { nama: 'Mouse', harga: 150000 },
    { nama: 'Keyboard', harga: 850000 }
];
produk.sort((a, b) => a.harga - b.harga);  // Sortir berdasarkan harga

// ===== Chaining (bergabung) =====
const hasil = angka
    .filter(n => n % 2 === 0)     // Ambil genap: [2,4,6,8,10]
    .map(n => n * 3)              // Kali 3: [6,12,18,24,30]
    .reduce((sum, n) => sum + n, 0);  // Total: 90
console.log(hasil);  // → 90

// ===== Destructuring =====
const [pertama, kedua, ...sisanya] = [1, 2, 3, 4, 5];
console.log(pertama);  // → 1
console.log(kedua);    // → 2
console.log(sisanya);  // → [3, 4, 5]

// ===== Spread Operator =====
const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];
const gabungan = [...arr1, ...arr2];  // → [1, 2, 3, 4, 5, 6]

7. Objects

Object adalah struktur data yang menyimpan pasangan key-value (properti dan nilai). Object digunakan untuk merepresentasikan entitas nyata seperti pengguna, produk, atau konfigurasi.

JavaScript — Objects
// ===== Membuat Object =====
const user = {
    nama: 'Beebane',
    umur: 25,
    email: 'bee@example.com',
    isActive: true,
    hobi: ['coding', 'gaming', 'reading'],
    alamat: {
        kota: 'Jakarta',
        provinsi: 'DKI Jakarta'
    }
};

// ===== Mengakses Properti =====
console.log(user.nama);           // → 'Beebane' (dot notation)
console.log(user['email']);        // → 'bee@example.com' (bracket notation)
console.log(user.alamat.kota);     // → 'Jakarta' (nested)
console.log(user.hobi[0]);         // → 'coding'

// ===== Mengubah & Menambah Properti =====
user.umur = 26;                    // Ubah properti
user.phone = '08123456789';       // Tambah properti baru
delete user.isActive;             // Hapus properti

// ===== Object Methods =====
const kalkulator = {
    nama: 'Kalkulator',
    tambah(a, b) { return a + b; },
    kurang(a, b) { return a - b; },
    kali(a, b) { return a * b; }
};
console.log(kalkulator.tambah(5, 3));  // → 8

// ===== Destructuring =====
const { nama, umur, email } = user;
console.log(nama, umur);

// Dengan rename
const { nama: namaLengkap, umur: usia } = user;

// Dengan default value
const { role = 'member' } = user;

// Destructuring nested
const { alamat: { kota } } = user;
console.log(kota);  // → 'Jakarta'

// ===== Object Methods =====
const keys = Object.keys(user);        // ['nama', 'umur', 'email', ...]
const values = Object.values(user);    // ['Beebane', 25, 'bee@...', ...]
const entries = Object.entries(user);  // [['nama','Beebane'], ['umur',25], ...]

// ===== Spread & Merge =====
const defaults = { theme: 'dark', lang: 'id', fontSize: 16 };
const userPrefs = { theme: 'light', fontSize: 18 };
const config = { ...defaults, ...userPrefs };
// → { theme: 'light', lang: 'id', fontSize: 18 }

// ===== Optional Chaining (?.) =====
const kota = user?.alamat?.kota;        // → 'Jakarta'
const negara = user?.alamat?.negara;    // → undefined (tidak error!)

// ===== Loop Object =====
for (const [key, value] of Object.entries(user)) {
    console.log(`${key}: ${value}`);
}

8. Async/Await & Promises

JavaScript bersifat asynchronous — artinya bisa menjalankan operasi yang memakan waktu (seperti mengambil data dari server) tanpa memblokir kode lainnya. Promise dan async/await adalah cara modern untuk menangani operasi async.

Promises

JavaScript — Promises
// ===== Promise: representasi operasi yang belum selesai =====
// States: pending → fulfilled (berhasil) / rejected (gagal)

// Membuat Promise
function ambilData(userId) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (userId > 0) {
                resolve({ id: userId, nama: 'Beebane' });
            } else {
                reject(new Error('User ID tidak valid'));
            }
        }, 1000);  // Simulasi delay 1 detik
    });
}

// Menggunakan Promise dengan .then()
ambilData(1)
    .then(user => console.log('User:', user))
    .catch(error => console.error('Error:', error.message))
    .finally(() => console.log('Selesai!'));

// Promise.all — jalankan beberapa promise sekaligus
const promise1 = ambilData(1);
const promise2 = ambilData(2);
const promise3 = ambilData(3);

Promise.all([promise1, promise2, promise3])
    .then(users => console.log('Semua user:', users))
    .catch(error => console.error('Error:', error.message));

Async/Await

JavaScript — Async/Await
// async/await: cara lebih bersih untuk menggunakan Promise
// async di depan function, await di depan Promise

async function tampilkanUser() {
    try {
        // await akan "menunggu" promise selesai
        const user1 = await ambilData(1);
        console.log('User 1:', user1);

        const user2 = await ambilData(2);
        console.log('User 2:', user2);

        const user3 = await ambilData(3);
        console.log('User 3:', user3);

        return [user1, user2, user3];
    } catch (error) {
        console.error('Gagal mengambil data:', error.message);
    } finally {
        console.log('Proses selesai');
    }
}

// Memanggil async function
tampilkanUser().then(users => {
    console.log('Semua user berhasil diambil');
});

// Parallel execution dengan async/await
async function ambilSemuaUser() {
    try {
        // Jalankan semua promise sekaligus (lebih cepat!)
        const [user1, user2, user3] = await Promise.all([
            ambilData(1),
            ambilData(2),
            ambilData(3)
        ]);
        console.log('Semua user:', user1, user2, user3);
    } catch (error) {
        console.error('Error:', error.message);
    }
}
Diagram: Async Flow
  Sequential (satu per satu):       Parallel (bersamaan):
  ──────────────────────            ──────────────────────
  request 1 ──► [2s] ──► ✓         request 1 ──► [2s] ──┐
  request 2 ──► [2s] ──► ✓         request 2 ──► [2s] ──┤ ► ✓
  request 3 ──► [2s] ──► ✓         request 3 ──► [2s] ──┘

  Total: ~6 detik                   Total: ~2 detik (3x lebih cepat!)

  Sequential: await ... satu per satu
  Parallel:   await Promise.all([...])

9. Fetch API

Fetch API adalah cara modern untuk melakukan HTTP request dari browser. Fetch mengembalikan Promise dan merupakan pengganti XMLHttpRequest yang lebih sederhana dan powerful.

GET Request

JavaScript — Fetch GET
// ===== Fetch dasar — GET request =====
async function ambilPostingan() {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');

        // Cek apakah response berhasil (status 200-299)
        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
        }

        const data = await response.json();  // Parse JSON
        console.log('Judul:', data.title);
        console.log('Isi:', data.body);
        return data;
    } catch (error) {
        console.error('Gagal mengambil data:', error.message);
    }
}

// ===== Mengambil daftar data =====
async function ambilSemuaPost() {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts');
    const posts = await response.json();

    // Tampilkan di halaman
    const container = document.querySelector('#posts');
    container.innerHTML = posts
        .slice(0, 10)  // Ambil 10 pertama
        .map(post => `
            <div class="card">
                <h3>${post.title}</h3>
                <p>${post.body}</p>
            </div>
        `)
        .join('');
}

POST Request

JavaScript — Fetch POST
// ===== POST request — mengirim data ke server =====
async function buatPost(judul, konten) {
    try {
        const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                title: judul,
                body: konten,
                userId: 1
            })
        });

        if (!response.ok) {
            throw new Error(`HTTP error! Status: ${response.status}`);
        }

        const data = await response.json();
        console.log('Post berhasil dibuat:', data);
        return data;
    } catch (error) {
        console.error('Gagal membuat post:', error.message);
    }
}

// ===== PUT (update) =====
async function updatePost(id, dataBaru) {
    const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(dataBaru)
    });
    return await response.json();
}

// ===== DELETE =====
async function hapusPost(id) {
    const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`, {
        method: 'DELETE'
    });
    return response.ok;
}

// ===== Fetch dengan Query Parameters =====
async function cariPost(userId) {
    const params = new URLSearchParams({ userId });
    const response = await fetch(
        `https://jsonplaceholder.typicode.com/posts?${params}`
    );
    return await response.json();
}

// Contoh penggunaan
document.querySelector('#btn-load').addEventListener('click', async () => {
    const btn = document.querySelector('#btn-load');
    btn.textContent = 'Loading...';
    btn.disabled = true;

    try {
        await ambilSemuaPost();
    } finally {
        btn.textContent = 'Load Posts';
        btn.disabled = false;
    }
});
⚠️ Error Handling dengan Fetch

Perlu diingat: fetch() hanya reject promise-nya saat network error (misalnya tidak ada internet). Response HTTP seperti 404 atau 500 bukan network error — Anda harus mengecek response.ok secara manual. Selalu gunakan try/catch dan cek response.ok.

10. Quiz: Uji Pemahamanmu!

Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang JavaScript:

Pertanyaan 1: Apa perbedaan utama antara let dan const?

a) let lebih cepat dari const
b) const tidak bisa diubah nilainya setelah dideklarasikan, sedangkan let bisa
c) let hanya untuk angka, const untuk semua tipe data
d) Tidak ada perbedaan, keduanya sama

Pertanyaan 2: Method array apa yang membuat array baru dengan hasil transformasi setiap elemen?

a) filter()
b) forEach()
c) map()
d) reduce()

Pertanyaan 3: Apa output dari typeof null?

a) "null"
b) "undefined"
c) "object"
d) "boolean"

Pertanyaan 4: Untuk mencegah form melakukan reload halaman saat di-submit, kode apa yang harus ditulis?

a) event.stopPropagation()
b) event.preventDefault()
c) return false
d) event.cancel()

Pertanyaan 5: Apa output dari kode berikut?
console.log(1 + "2" + "2")

a) 5
b) "122"
c) "32"
d) 122
🔍 Zoom
100%
🎨 Tema