Apa itu JavaScript?
JavaScript (sering disingkat JS) adalah bahasa pemrograman tingkat tinggi yang membuat halaman web menjadi hidup. Jika HTML adalah kerangka dan CSS adalah dekorasi, maka JavaScript adalah mesin yang membuat semuanya berfungsi. Dengan JS, Anda dapat membuat konten yang diperbarui secara dinamis, mengontrol multimedia, menganimasikan gambar, dan hampir semua hal lain yang bisa dibayangkan di web.
Konsep & Sintaks Dasar
JavaScript memiliki beberapa konsep inti seperti variabel untuk menyimpan data, fungsi untuk menjalankan blok kode, dan event untuk merespons aksi pengguna.
Variabel
Variabel adalah wadah untuk menyimpan nilai data. Di JavaScript
modern, kita menggunakan let untuk variabel yang
nilainya bisa berubah, dan const untuk variabel yang
nilainya tetap (konstan).
Contoh Kode:
// Variabel yang bisa diubah
let umur = 20;
umur = 21; // Sah
// Variabel konstan (tidak bisa diubah)
const nama = "Budi";
// nama = "Andi"; // Ini akan menyebabkan error
console.log("Nama:", nama);
console.log("Umur:", umur);
Perintah console.log() sangat berguna untuk
menampilkan nilai variabel di konsol developer browser untuk
keperluan debugging.
Fungsi
Fungsi adalah blok kode yang dirancang untuk melakukan tugas tertentu. Fungsi dapat dipanggil berulang kali untuk menjalankan tugas tersebut.
Contoh Kode:
function sapa(namaPengguna) {
return "Halo, " + namaPengguna + "! Selamat datang.";
}
// Memanggil fungsi dan menyimpan hasilnya
let pesanSapaan = sapa("Miyamura");
console.log(pesanSapaan); // Output: "Halo, Miyamura! Selamat datang."
Contoh Interaktivitas (Manipulasi DOM)
Kekuatan terbesar JavaScript di web adalah kemampuannya untuk memanipulasi DOM (Document Object Model). DOM adalah representasi struktur halaman HTML dalam bentuk objek, yang memungkinkan JavaScript untuk membaca dan mengubah konten, struktur, dan gaya halaman.
Mengubah Teks Elemen
Kita bisa memilih elemen HTML menggunakan
document.getElementById() dan mengubah konten di
dalamnya dengan properti .innerHTML atau
.textContent.
Contoh Kode:
<!-- HTML -->
<h2 id="judul-sapaan">Halo!</h2>
<button id="tombol-ubah">Ubah Teks</button>
<!-- JavaScript -->
<script>
const tombol = document.getElementById('tombol-ubah');
const judul = document.getElementById('judul-sapaan');
tombol.addEventListener('click', function() {
judul.textContent = 'Teks Sudah Berubah!';
});
</script>
Hasil Tampilan Interaktif:
Halo!
Mengubah Gaya CSS
JavaScript juga dapat mengubah gaya CSS dari sebuah elemen secara
langsung melalui properti .style.
Contoh Kode:
<!-- HTML -->
<div id="kotak-ajaib">Ini adalah sebuah kotak.</div>
<button id="tombol-warna">Ubah Warna</button>
<!-- JavaScript -->
<script>
const tombolWarna = document.getElementById('tombol-warna');
const kotak = document.getElementById('kotak-ajaib');
tombolWarna.addEventListener('click', function() {
kotak.style.backgroundColor = '#4a90e2';
kotak.style.color = 'white';
kotak.style.fontWeight = 'bold';
});
</script>
Hasil Tampilan Interaktif:
Tipe Data, Operator, dan Kondisi
Untuk membangun logika program, Anda perlu memahami cara kerja tipe data, bagaimana memanipulasinya dengan operator, dan bagaimana program membuat keputusan dengan struktur kondisi.
Tipe Data Fundamental
JavaScript memiliki beberapa tipe data dasar:
-
String: Teks yang diapit oleh tanda kutip.
Contoh:
"Halo Dunia". -
Number: Angka, baik bilangan bulat maupun
desimal. Contoh:
100,3.14. -
Boolean: Hanya memiliki dua nilai,
trueataufalse. -
Array: Kumpulan data yang terurut, diapit oleh
kurung siku
[]. Contoh:["apel", "pisang", "ceri"]. -
Object: Kumpulan data yang tidak terurut dalam
bentuk pasangan kunci-nilai, diapit oleh kurung kurawal
{}.
Contoh Kode (Object):
const pengguna = {
nama: "Miyamura",
umur: 21,
isMember: true
};
console.log(pengguna.nama); // Mengakses nilai dengan notasi titik
Hasil di Konsol:
Miyamura
Operator
Operator adalah simbol yang digunakan untuk melakukan operasi pada variabel dan nilai.
-
Aritmatika:
+(tambah),-(kurang),*(kali),/(bagi). -
Perbandingan:
==(sama dengan),===(sama dengan dan sama tipe),!=(tidak sama dengan),>(lebih besar dari),<(lebih kecil dari). -
Logika:
&&(dan),||(atau),!(bukan/negasi).
Contoh Kode:
let nilaiA = 10;
let nilaiB = 5;
console.log(nilaiA + nilaiB); // Output: 15
console.log(nilaiA > nilaiB); // Output: true
Struktur Kondisi (If/Else)
Memungkinkan program untuk menjalankan blok kode yang berbeda
berdasarkan kondisi yang benar (true) atau salah
(false).
Contoh Kode:
let jam = 14;
if (jam < 12) {
console.log("Selamat pagi!");
} else if (jam < 18) {
console.log("Selamat siang!");
} else {
console.log("Selamat malam!");
}
Hasil di Konsol:
Selamat siang!
Perulangan dan Fitur Modern (ES6)
Perulangan (loops) adalah konsep inti untuk mengotomatisasi tugas yang berulang. Selain itu, JavaScript modern (ES6 dan seterusnya) memperkenalkan banyak fitur yang membuat penulisan kode menjadi lebih ringkas dan kuat.
Perulangan (Loops)
Dua jenis perulangan yang paling umum adalah for dan
while.
- For Loop: Digunakan ketika Anda tahu persis berapa kali Anda ingin mengulang sebuah aksi.
-
While Loop: Digunakan ketika Anda ingin
mengulang selama kondisi tertentu masih bernilai
true.
Contoh Kode (For Loop):
// Perulangan ini akan berjalan 5 kali (dari 0 hingga 4)
for (let i = 0; i < 5; i++) {
console.log("Perulangan ke-" + i);
}
Hasil di Konsol:
Perulangan ke-0
Perulangan ke-1
Perulangan ke-2
Perulangan ke-3
Perulangan ke-4
Bekerja dengan Array
Perulangan sangat berguna untuk memproses setiap item dalam sebuah
array. Metode .forEach() adalah cara modern dan lebih
mudah dibaca untuk melakukan ini.
Contoh Kode:
const buah = ["Apel", "Mangga", "Jeruk"];
buah.forEach(function(item) {
console.log("Saya suka buah " + item);
});
Hasil di Konsol:
Saya suka buah Apel
Saya suka buah Mangga
Saya suka buah Jeruk
Fitur Modern ES6: Template Literals & Arrow Functions
Template Literals (menggunakan back-tick `` ` ``)
memungkinkan Anda menyisipkan variabel langsung ke dalam string
dengan lebih mudah.
Arrow Functions (=>) menyediakan
sintaks yang lebih pendek untuk menulis fungsi.
Contoh Kode (Menggabungkan Keduanya):
const buah = ["Apel", "Mangga", "Jeruk"];
// Menggunakan Arrow Function dan Template Literals
buah.forEach(item => {
console.log(`Saya sangat suka buah ${item}!`);
});
Hasil di Konsol:
Saya sangat suka buah Apel!
Saya sangat suka buah Mangga!
Saya sangat suka buah Jeruk!
JavaScript Asinkron (Asynchronous)
Secara default, JavaScript menjalankan kode baris per baris (sinkron). Namun, untuk operasi yang butuh waktu (seperti mengambil data dari internet), kita menggunakan pola asinkron agar halaman tidak "freeze" atau macet saat menunggu operasi selesai.
Callbacks
Callback adalah sebuah fungsi yang diteruskan sebagai argumen ke fungsi lain, yang kemudian akan "dipanggil kembali" (called back) setelah operasi selesai. Ini adalah cara dasar untuk menangani kode asinkron.
Contoh Kode:
function ambilData(callback) {
// Simulasi mengambil data dari server selama 2 detik
setTimeout(function() {
const data = { id: 1, nama: "Produk A" };
callback(data); // Panggil kembali fungsi callback dengan data
}, 2000);
}
ambilData(function(hasil) {
console.log("Data diterima via callback:", hasil);
});
console.log("Menunggu data...");
Hasil di Konsol:
Menunggu data...
// (setelah 2 detik)
Data diterima via callback: {id: 1, nama: "Produk A"}
Catatan: Jika terlalu banyak callback bersarang, ini bisa menyebabkan "Callback Hell", yaitu kode yang sulit dibaca dan dikelola.
Promises
Promise adalah objek yang merepresentasikan keberhasilan (fulfillment) atau kegagalan (rejection) dari sebuah operasi asinkron. Ini adalah cara yang lebih modern dan terstruktur untuk menghindari Callback Hell.
Contoh Kode:
function ambilDataPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const data = { id: 2, nama: "Produk B" };
// Jika berhasil, panggil resolve()
resolve(data);
// Jika gagal, panggil reject('Error!')
}, 2000);
});
}
ambilDataPromise()
.then(hasil => {
console.log("Data diterima via Promise:", hasil);
})
.catch(error => {
console.error("Terjadi error:", error);
});
Async/Await
Async/Await adalah sintaks modern yang dibangun di atas Promises. Ini memungkinkan Anda menulis kode asinkron seolah-olah itu adalah kode sinkron, membuatnya sangat mudah dibaca dan dipahami.
-
async: Diletakkan sebelum sebuah fungsi untuk menandakan bahwa fungsi tersebut akan selalu mengembalikan Promise. -
await: Hanya bisa digunakan di dalam fungsiasync. Ini akan "menjeda" eksekusi fungsi sampai Promise selesai.
Contoh Kode:
async function prosesData() {
console.log("Mulai memproses data...");
try {
// Tunggu sampai ambilDataPromise() selesai
const hasil = await ambilDataPromise();
console.log("Data diterima via Async/Await:", hasil);
} catch (error) {
console.error("Gagal memproses data:", error);
}
console.log("Selesai memproses data.");
}
prosesData();
Penyimpanan Browser dan Modul Kode
Dua konsep penting dalam pengembangan web modern adalah kemampuan untuk menyimpan data di sisi klien (browser) dan mengorganisir kode secara efisien.
Web Storage: localStorage
localStorage adalah bagian dari Web Storage API yang
memungkinkan Anda menyimpan data dalam bentuk pasangan kunci-nilai
(key-value pairs) di browser pengguna. Data ini akan tetap
tersimpan bahkan setelah browser ditutup dan dibuka kembali.
-
localStorage.setItem('kunci', 'nilai'): Untuk menyimpan data. -
localStorage.getItem('kunci'): Untuk mengambil data. -
localStorage.removeItem('kunci'): Untuk menghapus data.
Penting: localStorage hanya dapat menyimpan
string. Untuk menyimpan objek atau array, Anda harus mengubahnya
menjadi string JSON dengan JSON.stringify() dan
mengembalikannya dengan JSON.parse().
Contoh Kode Interaktif:
// Menyimpan nama pengguna
const namaInput = document.getElementById('namaPengguna');
localStorage.setItem('namaDisimpan', namaInput.value);
// Mengambil dan menampilkan nama pengguna
const namaTersimpan = localStorage.getItem('namaDisimpan');
document.getElementById('display').textContent = `Halo, ${namaTersimpan}!`;
Hasil Tampilan Interaktif:
Halo, ...
JavaScript Modules (ES6 Modules)
Modul memungkinkan Anda memecah kode menjadi file-file kecil dan
terorganisir. Anda bisa menggunakan export untuk
mengekspos fungsi atau variabel dari satu file, dan
import untuk menggunakannya di file lain. Ini adalah
praktik standar untuk aplikasi skala besar.
Contoh Kode:
// File: helpers.js
export function sapa(nama) {
return `Halo, ${nama}!`;
}
// File: main.js
import { sapa } from './helpers.js';
const pesan = sapa('Miyamura');
console.log(pesan); // Output: Halo, Miyamura!
// File: index.html
// Perhatikan 'type="module"' pada tag script
<script type="module" src="main.js"></script>
Catatan: Contoh ini menggambarkan struktur file dan tidak dapat dijalankan langsung di sini, tetapi ini adalah cara kerja modul di proyek nyata.
Penanganan Error dan Fetch API
Menulis kode yang kuat berarti mengantisipasi kemungkinan error. Selain itu, aplikasi web modern seringkali perlu berkomunikasi dengan server untuk mengambil atau mengirim data, dan untuk itulah Fetch API digunakan.
Penanganan Error dengan try...catch
Blok try...catch memungkinkan Anda untuk menguji
sebuah blok kode untuk mencari error (di dalam try).
Jika error terjadi, Anda dapat menangkapnya dan menjalankan kode
untuk menanganinya (di dalam catch) tanpa
menghentikan eksekusi seluruh skrip.
Contoh Kode:
try {
// Mencoba menjalankan kode yang mungkin error
let hasil = variabelTidakAda;
console.log(hasil);
} catch (error) {
// Blok ini akan berjalan jika ada error di blok try
console.error("Terjadi sebuah error!");
console.error("Pesan error:", error.message);
}
console.log("Program tetap berjalan setelah error.");
Hasil di Konsol:
Terjadi sebuah error!
Pesan error: variabelTidakAda is not defined
Program tetap berjalan setelah error.
Mengambil Data dengan Fetch API
Fetch API menyediakan cara yang mudah dan logis untuk mengambil
sumber daya (seperti data JSON) dari jaringan secara asinkron.
Fetch mengembalikan sebuah Promise, sehingga sangat cocok
digunakan dengan async/await.
Contoh Kode (Mengambil data dari API publik):
async function ambilPengguna() {
const url = 'https://jsonplaceholder.typicode.com/users/1';
try {
const respons = await fetch(url);
// Periksa apakah permintaan berhasil (status code 200-299)
if (!respons.ok) {
throw new Error(`HTTP error! status: ${respons.status}`);
}
const dataPengguna = await respons.json(); // Mengubah respons menjadi objek JSON
console.log("Data Pengguna:", dataPengguna);
// Tampilkan nama pengguna di halaman
document.getElementById('nama-api').textContent = dataPengguna.name;
} catch (error) {
console.error('Gagal mengambil data pengguna:', error);
document.getElementById('nama-api').textContent = 'Gagal memuat data.';
}
}
// Panggil fungsi saat halaman dimuat
ambilPengguna();
Hasil Tampilan Interaktif:
Nama pengguna yang diambil dari API:
Memuat data...
Array Lanjutan dan Class (OOP)
Untuk membangun aplikasi yang kompleks dan terstruktur, penting untuk memahami cara memanipulasi data secara efisien dan bagaimana mengorganisir kode ke dalam struktur logis menggunakan class.
Metode Array Lanjutan: map, filter, reduce
Selain .forEach(), ada metode lain yang sangat kuat
untuk memanipulasi array tanpa mengubah array aslinya (prinsip
imutabilitas).
-
.map(): Membuat array baru dengan menerapkan sebuah fungsi pada setiap elemen dari array asli. -
.filter(): Membuat array baru yang berisi elemen-elemen yang "lulus" sebuah tes kondisi. -
.reduce(): "Mereduksi" semua elemen dalam array menjadi satu nilai tunggal (misalnya, menjumlahkan semua angka).
Contoh Kode:
const angka = [1, 2, 3, 4, 5];
// map: kalikan setiap angka dengan 2
const angkaKaliDua = angka.map(n => n * 2);
console.log(angkaKaliDua); // Output: [2, 4, 6, 8, 10]
// filter: ambil hanya angka yang genap
const angkaGenap = angka.filter(n => n % 2 === 0);
console.log(angkaGenap); // Output: [2, 4]
// reduce: jumlahkan semua angka
const total = angka.reduce((akumulator, nilaiSekarang) => akumulator + nilaiSekarang, 0);
console.log(total); // Output: 15
Pemrograman Berorientasi Objek dengan Class
ES6 memperkenalkan sintaks class, yang merupakan cara
yang lebih bersih dan mudah untuk membuat objek dan menangani
pewarisan (inheritance). Class adalah "cetak biru" untuk membuat
objek.
Contoh Kode:
class Hewan {
// Constructor berjalan saat objek baru dibuat
constructor(nama) {
this.nama = nama;
}
// Method (fungsi di dalam class)
bersuara() {
console.log(`${this.nama} mengeluarkan suara.`);
}
}
// Membuat objek (instance) baru dari class Hewan
const kucing = new Hewan('Meong');
const anjing = new Hewan('Gukguk');
kucing.bersuara(); // Output: Meong mengeluarkan suara.
anjing.bersuara(); // Output: Gukguk mengeluarkan suara.