# ๐จ Belajar JavaScript โ Dari 0 Sampai Pro > **by rยกxz ยท The ANERs** > *Dijelasin kayak ngomong sama bocil SD, dipraktekin kayak hacker beneran.* --- ## ๐ Daftar Isi 1. [Apa itu JavaScript?](#1-apa-itu-javascript) 2. [Setup โ Siap Tempur](#2-setup--siap-tempur) 3. [Variabel โ Kotak Penyimpan](#3-variabel--kotak-penyimpan) 4. [Tipe Data โ Jenis-jenis Isi Kotak](#4-tipe-data--jenis-jenis-isi-kotak) 5. [Operator โ Alat Hitung & Bandingin](#5-operator--alat-hitung--bandingin) 6. [Kondisi โ Pengambil Keputusan](#6-kondisi--pengambil-keputusan) 7. [Perulangan / Loop โ Kerja Berulang](#7-perulangan--loop--kerja-berulang) 8. [Fungsi โ Mesin yang Bisa Dipanggil](#8-fungsi--mesin-yang-bisa-dipanggil) 9. [Array โ Daftar Panjang](#9-array--daftar-panjang) 10. [Object โ Kartu Identitas](#10-object--kartu-identitas) 11. [DOM โ Ngoprek Halaman Web](#11-dom--ngoprek-halaman-web) 12. [Event โ Nangkep Aksi User](#12-event--nangkep-aksi-user) 13. [Asynchronous โ Kerja Sambil Nunggu](#13-asynchronous--kerja-sambil-nunggu) 14. [Fetch API โ Ambil Data dari Internet](#14-fetch-api--ambil-data-dari-internet) 15. [Error Handling โ Tangkap Kesalahan](#15-error-handling--tangkap-kesalahan) 16. [ES6+ โ Fitur Keren Modern](#16-es6--fitur-keren-modern) 17. [OOP โ Bikin Objek Kayak Nyata](#17-oop--bikin-objek-kayak-nyata) 18. [Module โ Pisah-pisah File](#18-module--pisah-pisah-file) 19. [Tips Pro & Best Practice](#19-tips-pro--best-practice) 20. [Project Mini โ Latihan Nyata](#20-project-mini--latihan-nyata) --- ## 1. Apa itu JavaScript? Bayangin lo bikin rumah. HTML itu **dindingnya** (struktur), CSS itu **catnya** (tampilan), nah JavaScript itu **listriknya** โ yang bikin rumah itu **hidup**, bisa dinyalain lampunya, buka pintunya, dll. JavaScript (disingkat **JS**) adalah bahasa pemrograman yang bikin website jadi **interaktif**. Klik tombol โ sesuatu terjadi. Isi form โ data kekirim. Scroll โ animasi jalan. Semua itu JS. ### Fakta penting: - JS bisa jalan di **browser** (Chrome, Firefox, dll) langsung tanpa install apapun - JS juga bisa jalan di **server** pakai Node.js (nanti kita bahas) - JS adalah bahasa **paling populer** di dunia (survey Stack Overflow 10+ tahun berturut-turut) - Belajar JS = bisa bikin website, aplikasi, bot, game, bahkan AI --- ## 2. Setup โ Siap Tempur ### Cara paling gampang (langsung di browser): 1. Buka Chrome/Firefox 2. Klik kanan di halaman mana aja โ **Inspect** (atau tekan `F12`) 3. Klik tab **Console** 4. Ketik kode JS langsung di situ โ Enter! ### Cara proper (pakai VS Code): ```bash # 1. Install Node.js dulu (buat jalanin JS di luar browser) # Download di: nodejs.org # 2. Cek udah keinstall belum node --version # harusnya muncul angka versi npm --version # 3. Bikin file baru touch belajar.js # 4. Jalanin file node belajar.js ``` ### Halo Dunia pertama lo: ```javascript // Ini komentar โ tidak dijalankan, cuma catatan console.log("Halo Dunia!"); // Cetak teks ke layar console.log("Gue lagi belajar JS!"); ``` > ๐ก `console.log()` itu kayak **mulut** JavaScript โ apapun yang lo taruh di dalam kurung, dia yang "ngomong" ke layar. --- ## 3. Variabel โ Kotak Penyimpan Variabel itu kayak **kotak bertuliskan nama**. Lo taruh sesuatu di dalamnya, terus nanti bisa lo ambil lagi pakai namanya. ### 3 cara bikin variabel: ```javascript // var โ cara lama, hindari pemakaiannya var nama = "Rixz"; // let โ bisa diubah isinya, PAKAI INI untuk nilai yang berubah let umur = 17; umur = 18; // boleh diubah // const โ TIDAK BISA diubah, PAKAI INI untuk nilai tetap const kota = "Indonesia"; // kota = "Jepang"; // ERROR! const tidak bisa diganti ``` ### Aturan nama variabel: ```javascript // โ Boleh let namaLengkap = "Rixz Dev"; // camelCase โ standar JS let umur2 = 18; // boleh ada angka (bukan di depan) let _rahasia = "password123"; // boleh pakai underscore // โ Tidak boleh // let 2nama = "salah"; // tidak boleh mulai dengan angka // let nama-lengkap = "salah"; // tidak boleh pakai tanda minus // let let = "salah"; // tidak boleh pakai kata kunci JS ``` ### Contoh praktek: ```javascript const namaGue = "Rixz"; let nilaiUjian = 75; let sudahLulus = false; console.log("Nama:", namaGue); console.log("Nilai:", nilaiUjian); console.log("Lulus?", sudahLulus); // Update nilai nilaiUjian = 90; sudahLulus = true; console.log("Nilai baru:", nilaiUjian); console.log("Sekarang lulus?", sudahLulus); ``` --- ## 4. Tipe Data โ Jenis-jenis Isi Kotak Sama kayak kotak beneran โ ada kotak buat baju, buat makanan, buat uang. Di JS juga ada jenis-jenis data: ### Tipe data dasar (primitif): ```javascript // 1. String โ teks, diapit tanda kutip let nama = "Rixz"; let kota = 'Jakarta'; let sapaan = `Halo, ${nama}!`; // template literal โ bisa sisipkan variabel // 2. Number โ angka (bulat maupun desimal) let umur = 17; let tinggi = 170.5; let hutang = -50000; // 3. Boolean โ hanya true atau false (benar atau salah) let sudahMakan = true; let sudahBelajar = false; // 4. Undefined โ variabel ada tapi belum diisi let belumDiisi; console.log(belumDiisi); // undefined // 5. Null โ sengaja dikosongkan let dataPengguna = null; // 6. BigInt โ angka super besar let populasiDunia = 8000000000n; // 7. Symbol โ identitas unik (jarang dipakai pemula) let id = Symbol("id"); ``` ### Cek tipe data pakai `typeof`: ```javascript console.log(typeof "Rixz"); // "string" console.log(typeof 17); // "number" console.log(typeof true); // "boolean" console.log(typeof undefined); // "undefined" console.log(typeof null); // "object" โ ini bug JS sejak dulu, hafalin aja ``` ### String โ fitur penting: ```javascript let nama = "rixz engineering"; // Panjang teks console.log(nama.length); // 17 // Ubah huruf besar/kecil console.log(nama.toUpperCase()); // "RIXZ ENGINEERING" console.log(nama.toLowerCase()); // "rixz engineering" // Potong teks console.log(nama.slice(0, 4)); // "rixz" console.log(nama.slice(5)); // "engineering" // Cek apakah ada teks tertentu console.log(nama.includes("rixz")); // true console.log(nama.includes("aners")); // false // Ganti teks console.log(nama.replace("rixz", "aners")); // "aners engineering" // Pisah jadi array let kalimat = "satu dua tiga"; console.log(kalimat.split(" ")); // ["satu", "dua", "tiga"] // Template literal โ cara modern gabungkan teks let user = "Rixz"; let level = "Pro"; console.log(`User: ${user} | Level: ${level}`); // "User: Rixz | Level: Pro" ``` ### Number โ fitur penting: ```javascript let angka = 3.14159; // Bulatkan desimal console.log(angka.toFixed(2)); // "3.14" // Cek apakah angka console.log(isNaN("abc")); // true โ bukan angka console.log(isNaN(42)); // false โ ini angka // Math โ objek bawaan JS buat matematika console.log(Math.round(4.6)); // 5 console.log(Math.floor(4.9)); // 4 โ bulatkan ke bawah console.log(Math.ceil(4.1)); // 5 โ bulatkan ke atas console.log(Math.max(1, 5, 3)); // 5 console.log(Math.min(1, 5, 3)); // 1 console.log(Math.random()); // angka acak antara 0-1 console.log(Math.sqrt(16)); // 4 โ akar kuadrat console.log(Math.abs(-10)); // 10 โ nilai mutlak // Angka acak dalam range tertentu let min = 1, max = 100; let acak = Math.floor(Math.random() * (max - min + 1)) + min; console.log(acak); // angka acak 1-100 ``` --- ## 5. Operator โ Alat Hitung & Bandingin ### Operator Aritmatika (hitung-hitungan): ```javascript let a = 10; let b = 3; console.log(a + b); // 13 โ tambah console.log(a - b); // 7 โ kurang console.log(a * b); // 30 โ kali console.log(a / b); // 3.333... โ bagi console.log(a % b); // 1 โ sisa bagi (modulo โ hasil sisa pembagian) console.log(a ** b); // 1000 โ pangkat (10ยณ) // Shortcut let x = 5; x += 3; // sama dengan x = x + 3 โ 8 x -= 2; // sama dengan x = x - 2 โ 6 x *= 4; // sama dengan x = x * 4 โ 24 x /= 2; // sama dengan x = x / 2 โ 12 x++; // tambah 1 โ 13 x--; // kurang 1 โ 12 ``` ### Operator Perbandingan (hasilnya selalu true/false): ```javascript console.log(5 == "5"); // true โ sama nilainya (tidak cek tipe) console.log(5 === "5"); // false โ sama nilai DAN tipe (SELALU PAKAI INI!) console.log(5 !== "5"); // true โ tidak sama (strict) console.log(5 > 3); // true console.log(5 < 3); // false console.log(5 >= 5); // true console.log(5 <= 4); // false ``` > โ ๏ธ **PENTING:** Selalu pakai `===` bukan `==`. Kenapa? Karena `==` bisa nyebabkan bug aneh: > ```javascript > 0 == false // true โ aneh kan? > 0 === false // false โ ini yang bener > ``` ### Operator Logika: ```javascript let udahMakan = true; let udahMandi = false; // && (AND) โ kedua-duanya harus true console.log(udahMakan && udahMandi); // false // || (OR) โ salah satu true sudah cukup console.log(udahMakan || udahMandi); // true // ! (NOT) โ balik nilainya console.log(!udahMakan); // false console.log(!udahMandi); // true // Contoh nyata let umur = 17; let punyaKTP = false; let bolehMasuk = umur >= 18 && punyaKTP; console.log("Boleh masuk?", bolehMasuk); // false ``` --- ## 6. Kondisi โ Pengambil Keputusan Kondisi itu kayak **persimpangan jalan** โ kalau ke kiri, kalau ke kanan. ### if / else if / else: ```javascript let nilai = 85; if (nilai >= 90) { console.log("Grade A โ Luar biasa!"); } else if (nilai >= 80) { console.log("Grade B โ Bagus!"); } else if (nilai >= 70) { console.log("Grade C โ Cukup"); } else if (nilai >= 60) { console.log("Grade D โ Kurang"); } else { console.log("Grade E โ Perlu belajar lebih giat"); } ``` ### Switch โ kalau banyak pilihan: ```javascript let hari = "Senin"; switch (hari) { case "Senin": console.log("Awal pekan, semangat!"); break; case "Jumat": console.log("Hampir weekend!"); break; case "Sabtu": case "Minggu": console.log("Weekend, istirahat!"); break; default: console.log("Hari biasa"); } ``` > โ ๏ธ Jangan lupa `break`! Kalau tidak ada break, JS lanjut ke case berikutnya (ini disebut **fall-through** โ mengalir ke bawah tanpa berhenti). ### Ternary Operator โ kondisi singkat: ```javascript // Format: kondisi ? jalankan_kalau_true : jalankan_kalau_false let umur = 18; let status = umur >= 18 ? "Dewasa" : "Anak-anak"; console.log(status); // "Dewasa" // Nested ternary (jangan terlalu dalam, susah dibaca) let nilai = 75; let grade = nilai >= 90 ? "A" : nilai >= 80 ? "B" : nilai >= 70 ? "C" : "D"; console.log(grade); // "C" ``` ### Nullish Coalescing `??` โ nilai default: ```javascript let nama = null; let tampilan = nama ?? "Pengguna Anonim"; console.log(tampilan); // "Pengguna Anonim" let username = "rixz"; let tampilan2 = username ?? "Anonim"; console.log(tampilan2); // "rixz" ``` ### Optional Chaining `?.` โ akses aman: ```javascript let user = { nama: "Rixz", // tidak ada properti alamat }; // Tanpa optional chaining โ ERROR kalau alamat tidak ada // console.log(user.alamat.kota); // TypeError! // Dengan optional chaining โ aman console.log(user?.alamat?.kota); // undefined (tidak error) ``` --- ## 7. Perulangan / Loop โ Kerja Berulang Loop itu kayak **mesin fotokopi** โ lo set berapa kali, dia kerjain terus sampai selesai. ### for loop โ kalau tau berapa kali: ```javascript // Hitung 1 sampai 10 for (let i = 1; i <= 10; i++) { console.log(i); } // Cetak tabel perkalian 3 for (let i = 1; i <= 10; i++) { console.log(`3 x ${i} = ${3 * i}`); } ``` > ๐ก Anatomi for loop: > ``` > for (awal; kondisi; langkah) { ... } > โ โ โ > i=1 i<=10 i++ > mulai dari 1 berhenti kalau > 10 tambah 1 setiap putaran > ``` ### while loop โ kalau tidak tau berapa kali: ```javascript let uang = 100000; let harga = 25000; let beliKe = 0; while (uang >= harga) { uang -= harga; beliKe++; console.log(`Beli ke-${beliKe}, sisa uang: Rp${uang}`); } console.log(`Total beli: ${beliKe} item`); ``` ### do...while โ jalankan dulu, cek kondisi belakangan: ```javascript let angka; let tebakan = 7; do { angka = Math.floor(Math.random() * 10) + 1; console.log(`Keluar angka: ${angka}`); } while (angka !== tebakan); console.log(`Akhirnya keluar angka ${tebakan}!`); ``` ### for...of โ loop array (nanti lebih detail di bagian Array): ```javascript let buah = ["apel", "mangga", "jeruk", "pisang"]; for (let item of buah) { console.log(item); } ``` ### for...in โ loop properti object: ```javascript let orang = { nama: "Rixz", umur: 17, kota: "Indonesia" }; for (let key in orang) { console.log(`${key}: ${orang[key]}`); } ``` ### break & continue โ kendalikan loop: ```javascript // break โ hentikan loop sepenuhnya for (let i = 1; i <= 10; i++) { if (i === 5) break; // berhenti di 5 console.log(i); // cetak 1, 2, 3, 4 } // continue โ skip iterasi ini, lanjut ke berikutnya for (let i = 1; i <= 10; i++) { if (i % 2 === 0) continue; // skip angka genap console.log(i); // cetak 1, 3, 5, 7, 9 } ``` --- ## 8. Fungsi โ Mesin yang Bisa Dipanggil Fungsi itu kayak **resep masakan**. Lo tulis sekali, bisa dipakai berkali-kali. Masukkan bahan (parameter โ nilai yang dikirim masuk ke fungsi), keluar makanan (return value โ nilai yang dihasilkan fungsi). ### Deklarasi fungsi biasa: ```javascript function sapa(nama) { return `Halo, ${nama}! Selamat datang di ANERs.`; } let pesan = sapa("Rixz"); console.log(pesan); // "Halo, Rixz! Selamat datang di ANERs." console.log(sapa("Budi")); // "Halo, Budi! Selamat datang di ANERs." ``` ### Fungsi dengan banyak parameter: ```javascript function hitung(a, b, operasi) { if (operasi === "tambah") return a + b; if (operasi === "kurang") return a - b; if (operasi === "kali") return a * b; if (operasi === "bagi") return a / b; return "Operasi tidak dikenal"; } console.log(hitung(10, 5, "tambah")); // 15 console.log(hitung(10, 5, "kali")); // 50 console.log(hitung(10, 5, "bagi")); // 2 ``` ### Default parameter โ nilai kalau tidak dikirim: ```javascript function buat_akun(nama, role = "user", level = 1) { return { nama, role, level }; } console.log(buat_akun("Rixz", "admin", 99)); // { nama: 'Rixz', role: 'admin', level: 99 } console.log(buat_akun("Budi")); // { nama: 'Budi', role: 'user', level: 1 } ``` ### Arrow Function โ cara singkat modern: ```javascript // Fungsi biasa function kuadrat(x) { return x * x; } // Arrow function โ lebih ringkas const kuadrat = (x) => x * x; // satu baris const kuadrat = x => x * x; // kalau satu parameter, kurung boleh hilang // Kalau lebih dari satu baris const proses = (a, b) => { let hasil = a * b; hasil += 10; return hasil; }; console.log(kuadrat(5)); // 25 console.log(proses(3, 4)); // 22 ``` ### Fungsi memanggil fungsi lain: ```javascript function celsius_ke_fahrenheit(c) { return (c * 9/5) + 32; } function tampilkan_suhu(celcius) { let fahrenheit = celsius_ke_fahrenheit(celcius); console.log(`${celcius}ยฐC = ${fahrenheit}ยฐF`); } tampilkan_suhu(100); // "100ยฐC = 212ยฐF" tampilkan_suhu(37); // "37ยฐC = 98.6ยฐF" ``` ### Rest Parameter โ terima banyak argumen: ```javascript function jumlahkan(...angka) { let total = 0; for (let n of angka) { total += n; } return total; } console.log(jumlahkan(1, 2, 3)); // 6 console.log(jumlahkan(10, 20, 30, 40)); // 100 console.log(jumlahkan(5)); // 5 ``` --- ## 9. Array โ Daftar Panjang Array itu kayak **lemari laci bernomor**. Laci nomor 0, 1, 2, 3... (dimulai dari 0, ingat ya!). ### Membuat dan mengakses array: ```javascript let buah = ["apel", "mangga", "jeruk", "pisang"]; console.log(buah[0]); // "apel" โ index 0 = pertama console.log(buah[1]); // "mangga" console.log(buah[3]); // "pisang" โ index 3 = keempat console.log(buah.length); // 4 โ jumlah item // Ganti item buah[1] = "durian"; console.log(buah); // ["apel", "durian", "jeruk", "pisang"] ``` ### Method array penting: ```javascript let arr = [3, 1, 4, 1, 5, 9, 2, 6]; // Tambah/hapus di ujung arr.push(7); // tambah di belakang โ [..., 7] arr.pop(); // hapus dari belakang โ keluarkan 7 // Tambah/hapus di depan arr.unshift(0); // tambah di depan โ [0, 3, 1, ...] arr.shift(); // hapus dari depan โ keluarkan 0 // Cari index console.log(arr.indexOf(5)); // 4 โ posisi angka 5 console.log(arr.includes(9)); // true โ ada angka 9? // Gabungkan jadi string let kata = ["Halo", "dunia", "dari", "ANERs"]; console.log(kata.join(" ")); // "Halo dunia dari ANERs" console.log(kata.join("-")); // "Halo-dunia-dari-ANERs" // Balik urutan let angka = [1, 2, 3, 4, 5]; angka.reverse(); console.log(angka); // [5, 4, 3, 2, 1] // Sortir let acak = [3, 1, 4, 1, 5, 9]; acak.sort((a, b) => a - b); // ascending console.log(acak); // [1, 1, 3, 4, 5, 9] acak.sort((a, b) => b - a); // descending console.log(acak); // [9, 5, 4, 3, 1, 1] // Potong array let buah2 = ["apel", "manga", "jeruk", "pisang", "semangka"]; console.log(buah2.slice(1, 3)); // ["manga", "jeruk"] โ dari index 1 sampai sebelum 3 console.log(buah2.slice(2)); // ["jeruk", "pisang", "semangka"] // Hapus/ganti bagian array let angka2 = [1, 2, 3, 4, 5]; angka2.splice(2, 1); // hapus 1 item dari index 2 console.log(angka2); // [1, 2, 4, 5] angka2.splice(1, 0, 99, 100); // sisipkan di index 1, hapus 0 item console.log(angka2); // [1, 99, 100, 2, 4, 5] ``` ### Array Methods Fungsional โ WAJIB dikuasai: ```javascript let angka = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // forEach โ lakukan sesuatu untuk setiap item (tidak return array baru) angka.forEach(n => console.log(n * 2)); // map โ ubah setiap item, hasilkan array baru let dikalikaDua = angka.map(n => n * 2); console.log(dikalikaDua); // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] // filter โ ambil item yang memenuhi syarat let genap = angka.filter(n => n % 2 === 0); console.log(genap); // [2, 4, 6, 8, 10] // find โ ambil item PERTAMA yang memenuhi syarat let pertamaLebihDari5 = angka.find(n => n > 5); console.log(pertamaLebihDari5); // 6 // some โ apakah ADA item yang memenuhi syarat? console.log(angka.some(n => n > 9)); // true console.log(angka.some(n => n > 100)); // false // every โ apakah SEMUA item memenuhi syarat? console.log(angka.every(n => n > 0)); // true console.log(angka.every(n => n > 5)); // false // reduce โ gabungkan semua item jadi satu nilai let total = angka.reduce((akumulator, n) => akumulator + n, 0); console.log(total); // 55 // flat โ ratakan array bersarang let nested = [1, [2, 3], [4, [5, 6]]]; console.log(nested.flat()); // [1, 2, 3, 4, [5, 6]] console.log(nested.flat(2)); // [1, 2, 3, 4, 5, 6] ``` ### Contoh nyata โ kombinasi methods: ```javascript let mahasiswa = [ { nama: "Rixz", nilai: 95 }, { nama: "Budi", nilai: 60 }, { nama: "Citra", nilai: 80 }, { nama: "Dedi", nilai: 45 }, { nama: "Eka", nilai: 88 }, ]; // Ambil mahasiswa yang lulus (nilai >= 70) let lulus = mahasiswa .filter(m => m.nilai >= 70) .map(m => m.nama); console.log("Yang lulus:", lulus); // ["Rixz", "Citra", "Eka"] // Hitung rata-rata nilai let rata = mahasiswa.reduce((sum, m) => sum + m.nilai, 0) / mahasiswa.length; console.log("Rata-rata:", rata.toFixed(2)); // "73.60" ``` --- ## 10. Object โ Kartu Identitas Object itu kayak **kartu identitas** atau **formulir**. Ada kolom-kolomnya (property โ atribut/kolom pada object), dan tiap kolom ada isinya (value โ isi dari property). ### Membuat object: ```javascript let orang = { nama: "Rixz", umur: 17, kota: "Indonesia", hobi: ["coding", "security research", "musik"], aktif: true }; // Akses property console.log(orang.nama); // "Rixz" โ dot notation console.log(orang["umur"]); // 17 โ bracket notation console.log(orang.hobi[0]); // "coding" // Ubah property orang.umur = 18; orang.kota = "Jakarta"; // Tambah property baru orang.email = "rixz@example.com"; orang.level = "Pro"; // Hapus property delete orang.aktif; console.log(orang); ``` ### Method dalam object (fungsi di dalam object): ```javascript let kalkulator = { hasil: 0, tambah(angka) { this.hasil += angka; // 'this' merujuk ke object kalkulator itu sendiri return this; // return this buat chaining }, kurang(angka) { this.hasil -= angka; return this; }, reset() { this.hasil = 0; return this; }, tampilkan() { console.log("Hasil:", this.hasil); return this; } }; // Method chaining โ panggil beruntun kalkulator .tambah(100) .tambah(50) .kurang(30) .tampilkan() // Hasil: 120 .reset() .tampilkan(); // Hasil: 0 ``` ### Destructuring โ bongkar object/array: ```javascript // Object destructuring let { nama, umur, kota } = orang; console.log(nama); // "Rixz" console.log(umur); // 18 // Rename waktu destructure let { nama: namaUser, kota: kotaUser } = orang; console.log(namaUser); // "Rixz" console.log(kotaUser); // "Jakarta" // Default value let { level = "Beginner" } = orang; console.log(level); // "Pro" (karena sudah ada) // Array destructuring let [pertama, kedua, ...sisanya] = [1, 2, 3, 4, 5]; console.log(pertama); // 1 console.log(kedua); // 2 console.log(sisanya); // [3, 4, 5] ``` ### Spread Operator `...` โ sebar isi: ```javascript // Spread array let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let gabung = [...arr1, ...arr2]; console.log(gabung); // [1, 2, 3, 4, 5, 6] // Copy array (bukan reference) let original = [1, 2, 3]; let copy = [...original]; copy.push(4); console.log(original); // [1, 2, 3] โ tidak berubah console.log(copy); // [1, 2, 3, 4] // Spread object let base = { nama: "Rixz", level: 1 }; let updated = { ...base, level: 99, role: "admin" }; console.log(updated); // { nama: "Rixz", level: 99, role: "admin" } ``` --- ## 11. DOM โ Ngoprek Halaman Web DOM (Document Object Model โ model dokumen yang bisa diakses JS) itu kayak **peta interaktif** halaman web lo. Pakai JS, lo bisa ubah, tambah, hapus elemen HTML secara langsung. ### Setup HTML dulu: ```html
Ini paragraf pertama.
Ini paragraf kedua.
๐ก๏ธ Suhu: ${data.main.temp}ยฐC (terasa ${data.main.feels_like}ยฐC)
โ๏ธ Kondisi: ${data.weather[0].description}
๐ง Kelembapan: ${data.main.humidity}%
๐ฌ๏ธ Angin: ${data.wind.speed} m/s
`; } catch (err) { hasilEl.innerHTML = `โ ${err.message}
`; } finally { loadingEl.textContent = ""; } } document.getElementById("tombolCari").addEventListener("click", () => { const kota = document.getElementById("inputKota").value.trim(); if (kota) getCuaca(kota); }); ``` --- ## ๐ Penutup Lo udah sampai di sini โ berarti lo serius bro. Ini bukan akhir, ini baru **awal**. Roadmap selanjutnya: | Level | Yang Dipelajari | |-------|----------------| | ๐ก Intermediate | Node.js, Express, NPM, REST API | | ๐ Advanced | TypeScript, React/Vue/Svelte, Testing | | ๐ด Pro | System Design, Performance, Security, WebSockets | | ๐ฃ Expert | Compiler internals, V8 engine, Custom runtimes | ### Resources terbaik buat lanjut: - **javascript.info** โ dokumentasi terlengkap dan paling jelas - **MDN Web Docs** โ referensi resmi semua fitur JS - **freeCodeCamp** โ kurikulum gratis terstruktur - **roadmap.sh/javascript** โ peta jalan visual --- > *"The best way to learn programming is to write code, break it, fix it, and repeat."* > > **โ rยกxz ยท The ANERs** --- *Dokumen ini dibuat untuk komunitas ANERs โ AI-Native Engineering & Research Systems*