Program JavaScript, dari skrip hitung diskon sederhana sampai aplikasi web berukuran besar, tersusun dari satuan yang sama: instruksi yang dijalankan satu per satu oleh engine. Dua satuan terkecil penyusunnya adalah statement dan expression. Keduanya sering dianggap istilah yang bisa saling dipertukarkan, padahal perbedaannya menentukan apakah sebuah baris kode sah, mengapa titik koma perlu ditulis, dan bagaimana kita membaca pesan error yang menunjuk ke salah satu statement.
Chapter ini membedakan keduanya dengan contoh yang dapat dijalankan langsung di Node, lalu mengamati bagaimana urutan eksekusi menentukan hasil akhir sebuah program. Pemahaman ini menjadi fondasi bagi seluruh chapter berikutnya, karena setiap fitur JavaScript yang akan kita pelajari pada akhirnya berbentuk statement yang memuat expression.
Statement: Instruksi Penyusun Program #
Statement adalah satu perintah lengkap yang meminta engine melakukan sesuatu: membuat variabel, menyimpan nilai, atau menampilkan tulisan ke console. Engine membaca program dari atas ke bawah dan menjalankan satu statement sebelum pindah ke statement berikutnya. Urutan penulisan pada dasarnya sama dengan urutan pelaksanaan.
Tiga jenis statement yang akan paling sering kita tulis di awal perjalanan:
- Statement deklarasi: membuat variabel baru, misalnya
let hargaKopi = 35000;. - Statement assignment: mengisi atau menimpa nilai variabel yang sudah ada, misalnya
total = 75000;. - Statement pemanggilan: menjalankan function, misalnya
console.log("Halo");.
Kebiasaan yang dianjurkan adalah mengakhiri setiap statement dengan titik koma (;). Engine sebenarnya dapat menyisipkan titik koma secara otomatis (automatic semicolon insertion), tetapi menuliskannya secara eksplisit membuat niat kita tidak bergantung pada aturan penyisipan yang punya banyak pengecualian.
Expression: Kode yang Menghasilkan Nilai #
Expression adalah kode yang, ketika dievaluasi oleh engine, menghasilkan satu nilai. Bentuk paling sederhana adalah literal: angka 35000 dan teks "Kopi Gayo" keduanya adalah expression yang nilai langsung tampak. Expression juga bisa berupa perhitungan, seperti 35 + 65, yang dievaluasi menjadi 100:
console.log(35000); // expression literal angka
console.log("Kopi Gayo"); // expression literal string
console.log(35 + 65); // expression aritmetika, dievaluasi menjadi 100
Output yang Dihasilkan:
35000
Kopi Gayo
100Mari kita amati: engine mengevaluasi kode di dalam kurung console.log(...) terlebih dahulu, kemudian hasilnya ditampilkan ke terminal. Nilai 35 + 65 tidak pernah tampil sebagai teks "35 + 65", melainkan sebagai 100 — hasil evaluasi expression tersebut.
Setiap Statement Dibangun dari Expression #
Statement dan expression bukan dua dunia yang terpisah. Sebuah statement deklarasi tersusun dari kata kunci let, identifier di sisi kiri, dan satu expression di sisi kanan tanda =. Engine mengevaluasi expression di kanan terlebih dahulu, lalu menyimpan hasilnya ke wadah bernama di kiri. Dengan pola yang sama, statement pemanggilan console.log("Total:", 100) membawa dua expression sebagai argument.
Ada pula statement yang isinya hanya satu expression, disebut expression statement. Engine tetap mengevaluasi expression tersebut, tetapi karena hasilnya tidak disimpan ke mana pun, nilai itu langsung dibuang. Kita akan melihat buktinya pada berkas contoh di bagian berikut.
Satu sifat lagi yang penting: karena setiap expression menghasilkan nilai, expression boleh menjadi bagian dari expression lain. Perhitungan 35 + 65 yang tadi menghasilkan 100 bisa disusun ke dalam perhitungan lebih besar, misalnya dikalikan dengan nilai lain, dan hasil akhirnya tetap satu nilai tunggal. Cara menyusun expression yang panjang inilah yang nanti diatur oleh urutan operator pada section Operators.
Mengamati Urutan Eksekusi #
Berkas berikut menghitung total belanja dua bungkus kopi. Setiap barisnya adalah satu statement, dan keluaran menunjukkan urutan pelaksanaannya:
// urutan-eksekusi.js
// Total belanja sederhana: statement dieksekusi berurutan dari atas ke bawah.
let hargaKopi = 35000;
let jumlahBungkus = 2;
let total = hargaKopi * jumlahBungkus;
console.log("Harga per bungkus:", hargaKopi);
console.log("Jumlah bungkus:", jumlahBungkus);
console.log("Total belanja:", total);
// Statement berisi expression tanpa efek: nilai dihitung lalu dibuang.
hargaKopi * 100;
console.log("Harga kopi tidak berubah:", hargaKopi);Output yang Dihasilkan:
Harga per bungkus: 35000
Jumlah bungkus: 2
Total belanja: 70000
Harga kopi tidak berubah: 35000Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 4 (
let hargaKopi = 35000;): statement deklarasi membuat variabelhargaKopidan mengisinya dengan hasil evaluasi expression literal35000. - Baris 5 (
let jumlahBungkus = 2;): variabeljumlahBungkusdibuat dengan nilai2. Statement ini tidak bergantung pada statement sebelumnya, tetapi tetap dieksekusi sesudahnya. - Baris 6 (
let total = hargaKopi * jumlahBungkus;): engine mengevaluasi expressionhargaKopi * jumlahBungkuslebih dahulu (membaca nilai kedua variabel, menghasilkan70000), baru menyimpan hasilnya ketotal. - Baris 8–10 (
console.log(...)): tiga statement pemanggilan dijalankan berurutan sehingga tiga baris keluaran muncul dengan urutan yang sama persis dengan urutan penulisan. - Baris 13 (
hargaKopi * 100;): expression statement. Engine menghitung35000 * 100menjadi3500000, tetapi hasil itu tidak disimpan di mana pun sehingga keluaran program tidak terpengaruh. - Baris 14 (
console.log("Harga kopi tidak berubah:", hargaKopi);): membuktikan poin sebelumnya —hargaKopimasih35000karena perkalian tadi tidak pernah dikirim ke variabel.
Perhatikan juga bahwa keluaran selalu mengikuti urutan baris. Jika kita memindahkan console.log("Total belanja:", total); ke atas sebelum total dihitung, program akan menampilkan nilai yang berbeda. Urutan statement bukan gaya penulisan, melainkan bagian dari makna program.
Peta Jenis Statement yang Sudah Kita Kenal #
Empat bentuk yang muncul pada berkas di atas bisa dirangkum untuk rujukan cepat:
| Jenis statement | Contoh | Peran |
|---|---|---|
| Deklarasi | let hargaKopi = 35000; | Membuat wadah bernama sekaligus mengisinya |
| Assignment | total = 70000; | Menimpa isi wadah yang sudah ada |
| Pemanggilan | console.log(total); | Menjalankan function; argument-nya berupa expression |
| Expression statement | hargaKopi * 100; | Menghitung nilai tanpa menyimpannya — umumnya tak berguna |
Tabel ini akan bertambah seiring materi: statement percabangan dan perulangan menunggu di section Control Flow. Untuk saat ini, empat bentuk di atas sudah cukup untuk membaca dan menulis program lurus sederhana — dan semua latihan chapter berikutnya tetap berpijak pada mereka.
Satu Statement Bisa Melintasi Banyak Baris #
Akhir statement ditentukan oleh kelengkapan kalimat, bukan oleh pindah baris. Engine menyambung pembacaan selama kalimat belum selesai, sehingga satu statement boleh ditulis memanjang di beberapa baris untuk keterbacaan:
let totalTagihan =
2 * 35000 +
5000;
console.log(totalTagihan);Output yang Dihasilkan:
75000Engine mengevaluasi ketiga baris pertama sebagai satu statement deklarasi: expression 2 * 35000 + 5000 baru dianggap selesai setelah tanda ; ditemukan. Hasil evaluasinya, 75000, disimpan ke totalTagihan.
Setelah memahami satuan bangunan program, kita siap menambahkan catatan pembantu berupa komentar — topik chapter berikutnya — lalu menyimpan nilai secara lebih sengaja dengan variabel.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
urutan-eksekusi.js
Unduh berkas// urutan-eksekusi.js
// Total belanja sederhana: statement dieksekusi berurutan dari atas ke bawah.
let hargaKopi = 35000;
let jumlahBungkus = 2;
let total = hargaKopi * jumlahBungkus;
console.log("Harga per bungkus:", hargaKopi);
console.log("Jumlah bungkus:", jumlahBungkus);
console.log("Total belanja:", total);
// Statement berisi expression tanpa efek: nilai dihitung lalu dibuang.
hargaKopi * 100;
console.log("Harga kopi tidak berubah:", hargaKopi);