Soal 1Saat kamu melakukan loop pada orderIds.entries() dengan for...of, index dimulai dari berapa?
Perulangan — for, for...of, dan for...in
Pelajari perulangan JavaScript dari dasar: for untuk menghitung, for...of untuk mengambil element, for...in untuk key, dan cara menyusun nested loop.
Kalau ingin menampilkan harga setiap barang pesanan satu per baris tanpa loop, kamu harus menulis baris yang sama 3 kali untuk 3 barang dan 10 kali untuk 10 barang. Jumlah barangnya bergantung pada data, jadi kamu tidak bisa tahu sebelumnya berapa baris yang dibutuhkan.
Artikel ini membahas for yang mengulang sambil menghitung, for...of yang memberikan element satu per satu, dan for...in yang menelusuri key.
Mengulang Kode Sebanyak Jumlah Item — Tiga Expression di for
Misalnya kamu ingin menampilkan nama barang dari sebuah pesanan, satu per baris. Kalau kamu menuliskannya satu per satu, mulai dari console.log(orderLines[0]), kamu harus menambah baris begitu pesanannya bertambah jadi 4 item, dan mengubah kode setiap kali jumlahnya berubah.
Loop for (statement yang mengulang kode yang sama sambil menghitung) menerima tiga expression di dalam tanda kurung yang dipisahkan titik koma, sedangkan kode yang ingin diulang ditulis di dalam kurung kurawal. Isi kurung kurawal itu disebut body. Dari kiri ke kanan, ketiga expression itu adalah inisialisasi, kondisi, dan update: kondisi dicek sebelum masuk ke body, sedangkan update dijalankan setelah body.
i++ artinya sama dengan i = i + 1. Karena value-nya berubah di setiap putaran, i dideklarasikan dengan let.
const orderLines = ["Mug", "Buku tulis", "Pulpen"]; // nama barang di pesanan
// Mulai i dari 0 dan tambah 1 dengan i++ sampai mencapai jumlah item
for (let i = 0; i < orderLines.length; i++) {
// Index dimulai dari 0, jadi tampilkan i + 1 supaya hitungan mulai dari item ke-1
console.log(`Item ke-${i + 1}: ${orderLines[i]}`);
}
// Item ke-1: Mug
// Item ke-2: Buku tulis
// Item ke-3: Pulpen
console.log(`Item ditampilkan: ${orderLines.length}`); // Item ditampilkan: 3
Inisialisasi hanya dijalankan sekali di awal, kondisi dijalankan sebelum body, dan update dijalankan setelah body. Di putaran saat kondisinya menjadi false, loop berakhir tanpa menjalankan body.
Pengecekan kondisi, eksekusi body, dan update dihitung sebagai satu putaran (iterasi). Karena update dijalankan setelah body, value i selalu sama dengan berapa kali body sudah selesai dijalankan, sehingga di putaran pertama body berjalan dengan i yang masih 0.
Tabel di bawah menunjukkan value i dan hasil pengecekan kondisi di setiap putaran.
| Putaran | Value i dan kondisi | Yang terjadi di body |
|---|---|---|
| Putaran ke-1 | i = 0 / 0 < 3 true | Item ke-1: Mug |
| Putaran ke-2 | i = 1 / 1 < 3 true | Item ke-2: Buku tulis |
| Putaran ke-3 | i = 2 / 2 < 3 true | Item ke-3: Pulpen |
| Awal putaran ke-4 | i = 3 / 3 < 3 false | Body tidak dijalankan, loop selesai |
Membaca di Luar Batas Array Menghasilkan undefined
Kalau kondisinya kamu tulis sebagai i <= orderLines.length, ada satu putaran tambahan di akhir yang membaca orderLines[3], yaitu element yang tidak ada. Element di luar batas array bernilai undefined, jadi yang tampil adalah "Item ke-4: undefined", dan kalau loop-nya menjumlahkan harga, hasilnya menjadi NaN. Jalankan loop hanya selama index lebih kecil dari jumlah item.
Mengambil Element Secara Langsung — for...of dan entries
Misalnya kamu ingin memproses daftar nomor pesanan yang menunggu dikirim, satu per satu. Dengan for, kamu harus mendeklarasikan variabel index, menulis kondisi dan update, lalu membaca tiap element dengan orderIds[i] — dan kalau index-nya salah ketik, element yang terbaca pun salah.
for...of (statement yang mengambil element dari array atau iterable lain satu per satu dan memasukkannya ke variabel) ditulis sebagai for (const orderId of orderIds); di dalam tanda kurung cukup ada deklarasi variabel dan array-nya.
Kalau kamu juga butuh posisinya, lakukan loop pada orderIds.entries(). Di setiap putaran, kamu mendapat pasangan seperti [0, "A-1001"], yang bisa kamu pecah dengan kurung siku menjadi [index, orderId].
const orderIds = ["A-1001", "A-1002", "A-1003"]; // nomor pesanan yang menunggu dikirim
// orderId berisi elemennya langsung (tidak ada index sama sekali)
for (const orderId of orderIds) {
console.log(`Menunggu dikirim: ${orderId}`);
}
// Menunggu dikirim: A-1001 … (3 baris)
// Kalau index juga dibutuhkan, ambil pasangannya dari entries()
for (const [index, orderId] of orderIds.entries()) {
console.log(`#${index + 1}: ${orderId}`);
}
// #1: A-1001
// #2: A-1002
// #3: A-1003
| Cara mengambil | Isi variabel | Baris yang tercetak |
|---|---|---|
| Ambil element dengan of | Elemennya langsung (A-1001) | Menunggu dikirim: A-1001 |
| entries() → [index, orderId] | index 0 / orderId A-1001 | #1: A-1001 |
| entries() → 1 variabel | Pasangan index & element utuh | Tetap berupa array [0, "A-1001"] |
Cara kerja const [index, orderId] sama dengan destructuring array yang dibahas di artikel destructuring: index masuk ke posisi pertama dan element ke posisi kedua. Variabel baru dibuat di setiap putaran, jadi variabel loop for...of bisa dideklarasikan dengan const tanpa memicu error reassignment.
Menelusuri Key — for...in dan Alasan Tidak Memakainya di Array
Kadang kamu ingin menampilkan nama key dan value-nya berdampingan, misalnya untuk profil member. Kamu bisa mengubah key-nya jadi array dengan Object.keys(profile) lalu melakukan loop dengan for...of, tapi kalau yang kamu butuhkan hanya menelusuri key, ada cara yang lebih singkat.
for...in (statement yang menelusuri key sebuah object satu per satu) ditulis sebagai for (const key in profile). Yang masuk ke variabel adalah key dalam bentuk string, bukan value-nya, jadi value dibaca dengan bracket notation, seperti profile[key].
const profile = { displayName: "Budi", plan: "premium", posts: 12 };
// key berisi key dalam bentuk string (bukan value)
for (const key in profile) {
console.log(`${key}: ${profile[key]}`);
}
// displayName: Budi
// plan: premium
// posts: 12
// Di array, index datang dalam bentuk string
const stockCounts = [5, 0, 12];
for (const key in stockCounts) {
console.log(`${typeof key} / ${key + 1}`);
}
// string / 01
// string / 11
// string / 21 ← digabung sebagai string, bukan dijumlahkan sebagai number
Kalau kamu hanya membaca element, seperti stockCounts[key], string "1" tetap bisa dipakai untuk mengambil value-nya. Kamu bisa mengonversinya dengan Number(key) supaya bisa dipakai dalam perhitungan, tapi untuk element array, lebih sederhana memilih jenis loop lain sejak awal. Tabel di bawah menunjukkan kapan memakai masing-masing dari ketiganya.
| Sintaks | Isi variabel | Cocok untuk |
|---|---|---|
| for (let i = 0; i < jumlah; i++) | Index dalam bentuk number | Posisi dipakai dalam perhitungan |
| for (const item of array) | Elemennya langsung | Memproses element berurutan |
| for (const key in object) | Key dalam bentuk string | Menelusuri key object |
Object Tidak Bisa Di-loop dengan for...of
Kalau kamu menaruh object di sebelah kanan of, seperti for (const item of profile), eksekusi berhenti dengan TypeError: profile is not iterable. Object biasa tidak iterable: object tidak punya cara untuk memberikan isinya satu per satu. Kalau value-nya juga perlu diproses berurutan, ubah dulu object-nya jadi array dengan Object.entries.
Menampilkan Semua Kombinasi — Loop Dalam dan Loop Luar
Misalnya kamu ingin menampilkan produk yang dijual di setiap toko, sebagai daftar semua kombinasi toko dan produk. Satu loop hanya bisa menelusuri toko atau produk, tidak bisa keduanya sekaligus. Selain itu, jumlah toko maupun jumlah produknya sama-sama bergantung pada data.
Kamu bisa menaruh loop lain langsung di dalam body sebuah loop. Loop dalam berjalan sampai selesai di setiap putaran loop luar, jadi jumlah eksekusi body loop dalam adalah jumlah putaran luar dikali jumlah putaran dalam. Loop dalam juga bisa langsung membaca variabel loop luar.
const stores = ["Shibuya", "Yokohama"];
const products = ["Mug", "Buku tulis"];
// Di setiap putaran loop luar, loop dalam berjalan sampai selesai
for (const store of stores) {
for (const product of products) {
console.log(`${store} / ${product}`);
}
}
// Shibuya / Mug
// Shibuya / Buku tulis
// Yokohama / Mug
// Yokohama / Buku tulis
store— berganti dari "Shibuya" ke "Yokohama" di setiap putaran- Body loop luar hanya dijalankan 2 kali
product— berganti dari "Mug" ke "Buku tulis" di setiap putaran dalam- Bisa langsung membaca
storedari loop luar - Body ini dijalankan 2 × 2 = 4 kali
product dari loop dalam sekaligus store dari loop luar. product yang dideklarasikan di loop dalam hanya bisa dipakai di dalam kurung kurawal loop dalam.for...of bagian dalam mulai lagi dari awal products setiap kali putaran luar berganti, jadi selama store masih sama, hanya product yang berganti. Variabel yang dideklarasikan di awal body loop luar juga dibuat ulang di setiap putaran luar. Aturan tentang bagaimana kurung kurawal membatasi tempat sebuah variabel bisa dipakai dibahas di artikel tentang scope.
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Saat kamu melakukan loop pada array dengan for...in, apa yang masuk ke variabel loop?
Soal 3Kalau kamu menelusuri array berisi 3 element dan array berisi 4 element dengan nested loop, berapa kali body loop dalam dijalankan?