Kenalan Sama Loop di JavaScript
Bayangin gini deh, kamu lagi diminta buat nulis angka 1 sampai 100 di console. Kalau manual satu-satu, pasti cape banget kan? Nah, disinilah loop berperan penting buat kita sebagai developer.
Loop itu pada dasarnya adalah cara buat ngulang-ngulang code tertentu berkali-kali tanpa harus nulis ulang code yang sama. Jadi daripada nulis console.log(1), console.log(2), sampe console.log(100), kita bisa pake loop buat otomatis ngerjain itu semua cuma dalam beberapa baris code aja.
Konsep loop ini sebenernya udah kita lakuin dalam kehidupan sehari-hari loh. Misalnya waktu kamu lagi scroll feed Instagram, itu kan ngulang-ngulang action yang sama: tampilkan post, geser ke bawah, tampilkan post lagi. Atau waktu lagi antri di kasir, pelayan ngulang-ngulang proses yang sama buat setiap customer: scan barang, hitung total, terima pembayaran, kasih struk. Nah loop di programming juga konsepnya mirip kayak gitu.
Tiga Jenis Loop Utama yang Wajib Kamu Tau
Di JavaScript, ada tiga tipe loop utama yang bakal sering banget kamu pake. Masing-masing punya karakteristik dan kegunaan tersendiri:
For Loop - Ini adalah loop paling umum dan sering dipake. Cocok banget kalau kamu tau persisi berapa kali mau ngulang code-nya. Misalnya mau ngulang 10 kali, 50 kali, atau sesuai panjang array tertentu.
While Loop - Loop ini jalan selama kondisi tertentu masih terpenuhi. Bedanya sama for loop, kita lebih fokus ke kondisinya ketimbang berapa kali ngulangnya. Cocok buat situasi dimana kita gak tau pasti kapan loop-nya bakal berhenti.
Do-While Loop - Hampir sama kayak while loop, tapi dengan satu perbedaan penting: code-nya pasti dijalanin minimal sekali dulu sebelum ngecek kondisinya. Ini berguna buat beberapa kasus spesifik yang butuh minimal satu kali eksekusi.
Ketiga loop ini punya kelebihan masing-masing dan bakalan kita bahas lebih detail di section berikutnya. Yang penting kamu paham dulu konsep dasarnya: loop itu buat ngulang code, dan kita pilih jenis loop sesuai sama kebutuhan kita.
Kenapa Loop Itu Penting Banget?
Sebagai developer, loop bakal jadi salah satu tool yang paling sering kamu pake. Gak percaya? Coba deh pikirin beberapa skenario ini:
Waktu kamu bikin fitur tampilkan list produk di e-commerce, pasti butuh loop buat nampilin setiap produk dari database. Atau pas bikin validasi form dengan beberapa input, kamu perlu loop buat ngecek setiap field. Bahkan buat hal sederhana kayak ngitung total harga di keranjang belanja, loop juga dipake.
Intinya, hampir semua aplikasi modern pasti pake loop dalam berbagai bentuk. Makanya pemahaman yang solid tentang loop ini bakalan banget ngebantu kamu buat nulis code yang lebih efisien dan maintainable.
Sekarang kita mulai dari loop yang paling sering dipake: for loop.
Mengenal For Loop - Loop Paling Populer

Nah sekarang kita masuk ke loop pertama yang bakal jadi sahabat terbaik kamu sebagai developer: for loop. Ini adalah jenis loop yang paling sering dipake karena strukturnya yang jelas dan gampang dipahami.
For loop itu cocok banget dipake kalau kamu udah tau pasti berapa kali mau ngulang code-nya. Misalnya mau ngulang 5 kali, 10 kali, atau sebanyak jumlah data di array. Konsepnya simpel: kamu kasih tau si loop mulai dari mana, sampe kapan, dan setiap ngulang naik berapa.
Struktur For Loop yang Wajib Kamu Hafalin
Struktur for loop terdiri dari tiga bagian penting:
for (initialization; condition; increment) {
// code yang mau diulang
}
Initialization - Titik awal loop, biasanya let i = 0. Dijalanin sekali aja di awal.
Condition - Syarat buat loop terus jalan. Selama true, loop ngulang terus.
Increment - Update counter setiap putaran. Paling umum i++ buat naik 1.
Contoh Simpel For Loop
Langsung praktek aja yuk biar lebih ngerti:
for (let i = 0; i < 5; i++) {
console.log("Putaran ke-" + i);
}
Loop ini jalan 5 kali, dimulai dari i = 0 sampe i = 4. Setiap putaran, nilai i naik 1. Begitu i jadi 5, kondisi i < 5 jadi false dan loop berhenti.
Hasilnya di console:
Putaran ke-0
Putaran ke-1
Putaran ke-2
Putaran ke-3
Putaran ke-4
Perhatiin ya, loop jalan 5 kali tapi index-nya dari 0 sampe 4. Ini konsep zero-based indexing yang penting banget dalam programming.
Kapan Pake For Loop?
Iterate Array - Kegunaan paling umum untuk looping data:
const siswa = ["Budi", "Ani", "Citra", "Doni"];
for (let i = 0; i < siswa.length; i++) {
console.log("Siswa ke-" + (i + 1) + ": " + siswa[i]);
}
Hitung Mundur - Tinggal ganti increment jadi decrement:
for (let i = 10; i > 0; i--) {
console.log(i);
}
console.log("Happy New Year!");
Loncat-loncat - Misalnya ambil angka genap aja:
for (let i = 0; i < 10; i += 2) {
console.log(i); // 0, 2, 4, 6, 8
}
Break - Cara Berhentiin Loop Paksa
Kadang kamu butuh stop loop sebelum kondisinya jadi false. Pake break aja. Begitu ketemu break, loop langsung berhenti total.
Contohnya nyari angka pertama yang bisa dibagi 7:
for (let i = 1; i <= 100; i++) {
if (i % 7 === 0) {
console.log("Ketemu! Angka pertama yang bisa dibagi 7 adalah: " + i);
break; // langsung stop, gak lanjut sampe 100
}
}
Tanpa break, loop bakal jalan sampe 100 padahal udah nemu jawabannya di angka 7.
Continue - Cara Skip Putaran Tertentu
Beda sama break yang stop total, continue cuma skip putaran saat ini terus lanjut ke berikutnya.
Contoh print angka 1-10 tapi skip yang genap:
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
continue; // skip angka genap
}
console.log(i); // cuma print angka ganjil
}
Hasilnya: 1, 3, 5, 7, 9
Inget: break itu stop total, continue cuma skip terus lanjut.
Contoh Kasus Real World
Validasi Password - Cek apakah password mengandung minimal satu angka:
const password = "rahasia123";
let adaAngka = false;
for (let i = 0; i < password.length; i++) {
if (password[i] >= '0' && password[i] <= '9') {
adaAngka = true;
break; // udah ketemu angka, gak perlu cek lagi
}
}
if (adaAngka) {
console.log("Password valid");
} else {
console.log("Password harus mengandung angka");
}
Generate Tabel Perkalian:
const angka = 5;
for (let i = 1; i <= 10; i++) {
console.log(angka + " x " + i + " = " + (angka * i));
}
For loop memang powerful, tapi ada kalanya kamu gak tau pasti berapa kali loop bakal jalan. Nah, untuk situasi kayak gini, while loop jadi pilihan yang lebih cocok.
Mengenal While Loop - Loop Berdasarkan Kondisi

Kalau for loop fokusnya ke counter yang jelas, while loop lebih fokus ke kondisi. Loop ini akan terus jalan selama kondisi yang kamu kasih masih bernilai true.
While loop cocok buat situasi dimana kamu gak tau pasti berapa kali loop bakal jalan. Misalnya validasi input user, nunggu data dari server, atau game loop yang terus jalan sampe player kalah.
Struktur While Loop yang Lebih Simpel
Dibanding for loop yang strukturnya ada tiga bagian, while loop jauh lebih simpel:
while (condition) {
// code yang mau diulang
}
Selama condition-nya true, code bakal terus diulang. Begitu jadi false, loop berhenti.
Yang perlu kamu perhatiin: harus ada sesuatu di dalam loop yang bisa bikin kondisinya jadi false. Kalau nggak, bakal terjadi infinite loop.
Contoh Dasar While Loop
let i = 0;
while (i < 5) {
console.log("Angka: " + i);
i++;
}
Perhatiin perbedaannya sama for loop:
- Variabel i dibuat di luar loop
- Kondisinya cuma
i < 5 - Harus manual naikin nilai i dengan
i++
Hasilnya sama kayak for loop, tapi while loop lebih flexible dan juga lebih rawan error kalau lupa update kondisinya.
Kapan Sebaiknya Pake While Loop?
Validasi Input User - Loop sampe user kasih input yang bener:
let password = "";
while (password.length < 8) {
password = prompt("Masukkan password (minimal 8 karakter):");
}
console.log("Password diterima!");
Menu Interaktif - Loop sampe user pilih exit:
let pilihan = "";
while (pilihan !== "keluar") {
console.log("1. Lihat data");
console.log("2. Tambah data");
console.log("3. Hapus data");
console.log("ketik 'keluar' untuk exit");
pilihan = prompt("Pilih menu:");
// proses pilihan user disini
}
Nunggu Kondisi Tertentu - Misalnya nunggu data ready:
let dataReady = false;
while (!dataReady) {
// cek apakah data udah ready
dataReady = checkDataStatus();
if (!dataReady) {
console.log("Tunggu sebentar...");
}
}
console.log("Data siap diproses!");
Bahaya Infinite Loop yang Harus Kamu Hindari
Infinite loop terjadi kalau kondisi loop selalu true dan gak pernah berubah jadi false.
Contoh yang salah:
let i = 0;
while (i < 5) {
console.log(i);
// lupa naikin i, jadi i selalu 0 dan selalu < 5
}
Loop ini bakal print angka 0 terus menerus sampai browser crash. Nilai i gak pernah berubah, jadi kondisi i < 5 selalu true.
Contoh lain yang salah:
while (true) {
console.log("Loop ini gak bakal berhenti!");
}
Jangan pernah bikin kondisi yang hardcoded true kecuali kamu punya break statement di dalemnya.
Cara Aman Pake While Loop
Selalu update kondisi - Pastiin ada code yang bisa bikin kondisi jadi false:
let count = 0;
while (count < 10) {
console.log(count);
count++; // ini penting!
}
Pake break kalau perlu - Kalau pake while (true), harus ada break:
let angka = 0;
while (true) {
angka++;
if (angka > 5) {
break;
}
console.log(angka);
}
Contoh Real World: Simulasi Tebak Angka
const angkaRahasia = 7;
let tebakan = 0;
let percobaan = 0;
while (tebakan !== angkaRahasia) {
tebakan = parseInt(prompt("Tebak angka 1-10:"));
percobaan++;
if (tebakan < angkaRahasia) {
console.log("Terlalu kecil!");
} else if (tebakan > angkaRahasia) {
console.log("Terlalu besar!");
}
}
console.log("Benar! Kamu butuh " + percobaan + " kali percobaan");
Loop ini jalan sampe user berhasil nembak angka yang bener. Kita gak tau berapa kali user bakal salah, makanya while loop lebih cocok.
Perbedaan While vs For Loop
Biar makin jelas, ini ringkasannya:
Pake For Loop kalau:
- Kamu tau pasti berapa kali mau ngulang
- Butuh counter yang jelas
- Iterate array dengan index
Pake While Loop kalau:
- Gak tau berapa kali bakal ngulang
- Fokus ke kondisi, bukan jumlah iterasi
- Validasi input atau nunggu event tertentu
Keduanya sama-sama powerful, tinggal pilih yang paling cocok sama kebutuhan kamu. Nah, ada satu variasi while loop yang unik: do-while loop. Bedanya cuma satu, tapi cukup signifikan.
Do-While Loop - Loop dengan Twist Menarik

Do-while loop adalah versi unik dari while loop. Perbedaan utamanya ada di urutan eksekusi: do-while selalu menjalankan code-nya minimal sekali, baru kemudian ngecek kondisinya. Ini kebalikan dari while loop biasa yang ngecek kondisi dulu baru jalan.
Dalam prakteknya, do-while jarang banget dipake dibanding for atau while loop. Tapi ada beberapa kasus spesifik dimana do-while jadi pilihan yang tepat.
Struktur Do-While Loop
Struktur do-while sedikit beda dari loop lainnya:
do {
// code yang mau diulang
} while (condition);
Perhatiin kata kunci do di awal dan while di akhir. Code di dalam blok do bakal dijalanin dulu, baru setelah itu kondisi di while dicek. Kalau kondisinya true, loop ngulang lagi. Kalau false, loop berhenti.
Jangan lupa titik koma setelah while (condition) ya. Ini salah satu perbedaan syntax dengan while loop biasa.
Perbedaan Krusial: Execute Dulu, Cek Kemudian
Ini yang bikin do-while unik. Mari kita bandingkan:
While Loop Biasa:
let i = 10;
while (i < 5) {
console.log(i); // gak bakal jalan karena 10 bukan < 5
}
Hasilnya: gak ada output karena kondisi langsung false dari awal.
Do-While Loop:
let i = 10;
do {
console.log(i); // tetep jalan sekali
} while (i < 5);
Hasilnya: angka 10 tetep keprint meskipun kondisi false. Karena do-while execute dulu baru cek kondisi.
Kapan Pake Do-While Loop?
Do-while cocok buat situasi dimana kamu butuh code dijalanin minimal sekali, terlepas dari kondisinya.
Menu Aplikasi - Tampilin menu minimal sekali:
let pilihan;
do {
console.log("=== Menu Utama ===");
console.log("1. Tambah data");
console.log("2. Lihat data");
console.log("3. Keluar");
pilihan = prompt("Pilih menu:");
// proses pilihan
} while (pilihan !== "3");
Menu ini pasti tampil minimal sekali, baru kemudian cek apakah user mau keluar atau lanjut.
Validasi Input dengan Retry - Minta input minimal sekali:
let angka;
do {
angka = parseInt(prompt("Masukkan angka positif:"));
if (angka <= 0) {
console.log("Error! Harus angka positif");
}
} while (angka <= 0 || isNaN(angka));
console.log("Terima kasih! Angka valid: " + angka);
User pasti diminta input minimal sekali, terus loop sampe input-nya valid.
Kenapa Jarang Digunakan?
Dalam prakteknya, do-while jarang banget kamu temuin di codebase production. Ada beberapa alasan:
Bisa Diganti While Loop - Kebanyakan kasus do-while bisa diganti while loop biasa dengan sedikit modifikasi. Jadi developer lebih milih while loop yang lebih familiar.
Kurang Intuitif - Urutan "execute dulu, cek kemudian" agak counter-intuitive buat sebagian developer. While loop yang "cek dulu, execute kemudian" lebih natural.
Use Case Terbatas - Situasi dimana kamu bener-bener butuh minimal sekali eksekusi gak terlalu sering. Biasanya bisa diakalin pake while loop dengan flag atau kondisi awal.
Alternatif dengan While Loop
Hampir semua kasus do-while bisa diganti while loop. Contohnya:
Dengan Do-While:
let jawaban;
do {
jawaban = prompt("Lanjut? (ya/tidak)");
} while (jawaban !== "ya" && jawaban !== "tidak");
Dengan While Loop:
let jawaban = "";
while (jawaban !== "ya" && jawaban !== "tidak") {
jawaban = prompt("Lanjut? (ya/tidak)");
}
Hasilnya sama aja, cuma cara penulisannya beda. Makanya banyak developer yang lebih milih while loop.
Contoh Praktis: ATM Pin Validation
Ini salah satu contoh bagus penggunaan do-while:
const pinBenar = "1234";
let percobaan = 0;
let maxPercobaan = 3;
let pinUser;
do {
pinUser = prompt("Masukkan PIN ATM (4 digit):");
percobaan++;
if (pinUser === pinBenar) {
console.log("PIN benar! Akses diberikan");
break;
} else {
console.log("PIN salah! Sisa percobaan: " + (maxPercobaan - percobaan));
}
} while (percobaan < maxPercobaan && pinUser !== pinBenar);
if (percobaan === maxPercobaan && pinUser !== pinBenar) {
console.log("Kartu terblokir!");
}
User pasti diminta PIN minimal sekali, dan loop berjalan sampe PIN bener atau percobaan habis.
Kesimpulan Do-While Loop
Do-while punya tempat tersendiri di JavaScript, tapi jarang digunakan karena kebanyakan kasus bisa diatasi pake while atau for loop. Yang penting kamu tau konsepnya: execute dulu, cek kemudian.
Sejauh ini kita udah bahas loop-loop klasik yang udah ada sejak lama. Sekarang waktunya upgrade ke cara modern yang bikin code kamu lebih bersih: for...of loop.
For...Of Loop - Cara Modern Iterate Array

Setelah kita bahas loop-loop klasik, sekarang saatnya kenalan sama loop modern yang jauh lebih enak dipake: for...of loop. Ini adalah fitur ES6 yang bikin hidup developer jadi lebih gampang waktu harus iterate array.
For...of dirancang khusus buat ngulang data di array atau iterable object lainnya. Syntax-nya simpel, clean, dan gak perlu ribet sama index kayak for loop biasa. Kalau kamu cuma butuh value-nya aja tanpa peduli posisinya, for...of adalah pilihan terbaik.
Syntax yang Jauh Lebih Bersih
Dibanding for loop tradisional, for...of punya syntax yang lebih intuitif:
const buah = ["Apel", "Jeruk", "Mangga", "Pisang"];
for (const item of buah) {
console.log(item);
}
Gampang banget kan? Gak perlu tracking index, gak perlu array.length, gak perlu array[i]. Cukup bilang "untuk setiap item dari array buah, jalanin code ini".
Bandingkan dengan for loop tradisional:
const buah = ["Apel", "Jeruk", "Mangga", "Pisang"];
for (let i = 0; i < buah.length; i++) {
console.log(buah[i]);
}
Keduanya kasih hasil yang sama, tapi for...of jauh lebih mudah dibaca dan dipahami.
Kapan Pake For...Of Loop?
Iterate Array Tanpa Index - Kalau cuma butuh value-nya:
const scores = [85, 90, 78, 92, 88];
for (const score of scores) {
console.log("Nilai: " + score);
}
Proses Setiap Item - Misalnya validasi atau transformasi:
const passwords = ["abc", "12345678", "pass"];
for (const password of passwords) {
if (password.length < 8) {
console.log("Password '" + password + "' terlalu pendek");
}
}
Loop String - Ya, for...of juga bisa buat string:
const nama = "JavaScript";
for (const huruf of nama) {
console.log(huruf);
}
Hasilnya: J, a, v, a, S, c, r, i, p, t (satu-satu per huruf).
Keuntungan For...Of Loop
Lebih Readable - Code jadi lebih gampang dibaca. Siapa pun yang baca code kamu langsung paham: "oh ini lagi ngulang data dari array".
Less Error-Prone - Gak bakal ada typo index kayak i < array.lenght (salah eja length) atau lupa increment i++. Semua otomatis ditangani JavaScript.
Fokus ke Data - Kamu bisa fokus ke logic bisnis daripada ngurusin counter dan index. Code jadi lebih declarative.
Keterbatasan: Gak Bisa Akses Index
Satu hal yang perlu kamu tau: for...of gak ngasih akses langsung ke index. Kalau kamu butuh posisi item di array, for...of bukan pilihan yang tepat.
Misalnya kamu butuh output kayak gini:
0: Apel
1: Jeruk
2: Mangga
Dengan for...of, kamu gak bisa dapet angka di depannya. Untuk kasus kayak gini, kamu punya beberapa opsi:
Opsi 1: Pake For Loop Biasa
const buah = ["Apel", "Jeruk", "Mangga"];
for (let i = 0; i < buah.length; i++) {
console.log(i + ": " + buah[i]);
}
Opsi 2: Pake Array.forEach()
const buah = ["Apel", "Jeruk", "Mangga"];
buah.forEach((item, index) => {
console.log(index + ": " + item);
});
Opsi 3: Pake entries() dengan For...Of
const buah = ["Apel", "Jeruk", "Mangga"];
for (const [index, item] of buah.entries()) {
console.log(index + ": " + item);
}
Opsi ketiga ini masih pake for...of tapi dengan bantuan method entries(). Tapi kalau cuma buat dapet index, cara ini agak overkill.
For...Of vs ForEach - Mana yang Lebih Baik?
Banyak developer bingung kapan pake for...of dan kapan pake forEach. Ini perbedaannya:
For...Of:
- Bisa pake
breakdancontinue - Lebih flexible buat control flow
- Syntax lebih familiar buat yang biasa pake loop
ForEach:
- Lebih functional programming style
- Langsung kasih index sebagai parameter kedua
- Gak bisa pake break atau continue
Contoh bedanya:
const angka = [1, 2, 3, 4, 5];
// Dengan for...of - bisa pake break
for (const num of angka) {
if (num === 3) {
break; // stop total
}
console.log(num);
}
// Dengan forEach - gak bisa break
angka.forEach(num => {
if (num === 3) {
return; // cuma skip, gak stop loop
}
console.log(num);
});
Contoh Real World: Filter Data Produk
const produk = [
{ nama: "Laptop", harga: 10000000 },
{ nama: "Mouse", harga: 150000 },
{ nama: "Keyboard", harga: 500000 },
{ nama: "Monitor", harga: 2000000 }
];
console.log("Produk di bawah 1 juta:");
for (const item of produk) {
if (item.harga < 1000000) {
console.log(`${item.nama} - Rp ${item.harga}`);
}
}
Output:
Produk di bawah 1 juta:
Mouse - Rp 150000
Keyboard - Rp 500000
Clean dan mudah dipahami tanpa ribet sama index.
Kapan Sebaiknya Pake For...Of?
Pake for...of kalau:
- Iterate array atau string
- Cuma butuh value-nya, gak perlu index
- Butuh flexibility pake break atau continue
- Mau code yang lebih readable
Jangan pake for...of kalau:
- Butuh akses index item
- Loop object biasa (gunain for...in atau Object.keys)
- Butuh method chaining (pake map, filter, reduce)
Ngomong-ngomong soal for...in, ada loop lain yang namanya mirip tapi sebenernya beda banget: for...in loop. Tapi hati-hati, loop ini punya beberapa jebakan yang perlu kamu tau.
For...In Loop - Yang Sebaiknya Kamu Hindari

For...in loop adalah loop yang dirancang khusus buat iterate object properties. Meskipun terdengar berguna, loop ini punya beberapa masalah serius yang bikin banyak developer modern menghindarinya.
Nama for...in memang mirip banget sama for...of, tapi jangan sampe ketuker ya. Keduanya beda total: for...of buat array, for...in buat object. Dan sayangnya, for...in punya behavior yang sering bikin unexpected bug.
Syntax For...In Loop
Struktur for...in cukup simpel:
const user = {
nama: "Budi",
umur: 25,
kota: "Jakarta"
};
for (const key in user) {
console.log(key + ": " + user[key]);
}
Output:
nama: Budi
umur: 25
kota: Jakarta
Loop ini iterate semua property name (key) dari object. Sekilas terlihat oke, tapi ada jebakan yang perlu kamu waspadai.
Masalah Utama: Iterate Inherited Properties
Ini adalah masalah terbesar for...in: loop ini gak cuma iterate property yang ada di object kamu, tapi juga property yang diwariskan dari prototype chain.
Contohnya:
const mobil = {
merk: "Toyota",
tahun: 2020
};
// Tambahin property ke prototype
Object.prototype.kategori = "Kendaraan";
for (const key in mobil) {
console.log(key + ": " + mobil[key]);
}
Output:
merk: Toyota
tahun: 2020
kategori: Kendaraan // ini inherited property!
Property kategori muncul padahal kita gak define di object mobil. Ini karena for...in iterate semua property termasuk yang dari prototype. Bahaya banget kalau kamu gak aware.
Solusi Sementara: hasOwnProperty
Buat filter inherited properties, kamu bisa pake hasOwnProperty:
const mobil = {
merk: "Toyota",
tahun: 2020
};
Object.prototype.kategori = "Kendaraan";
for (const key in mobil) {
if (mobil.hasOwnProperty(key)) {
console.log(key + ": " + mobil[key]);
}
}
Output:
merk: Toyota
tahun: 2020
Sekarang kategori gak muncul lagi. Tapi ini cuma workaround, bukan solusi ideal. Code jadi lebih panjang dan kurang readable.
Kenapa For...In Tidak Direkomendasikan?
Unpredictable Behavior - Kamu gak pernah tau property apa aja yang bakal di-iterate. Kalau ada library yang nambahin sesuatu ke prototype, boom, code kamu berpotensi error.
Butuh Extra Check - Selalu harus pake hasOwnProperty bikin code jadi verbose. Kenapa harus ribet kalau ada cara yang lebih simple?
Performance Issue - For...in lebih lambat dibanding alternatif modern karena harus cek prototype chain.
Confusing untuk Array - Meskipun secara teknis bisa dipake buat array, hasilnya bakal iterate index sebagai string, bukan value. Ini sering bikin developer bingung.
Alternatif yang Lebih Baik
JavaScript modern punya tiga method yang jauh lebih aman dan predictable buat iterate object:
Object.keys() - Ambil Array of Keys
const user = {
nama: "Budi",
umur: 25,
kota: "Jakarta"
};
const keys = Object.keys(user);
console.log(keys); // ["nama", "umur", "kota"]
keys.forEach(key => {
console.log(key + ": " + user[key]);
});
Object.values() - Ambil Array of Values
const user = {
nama: "Budi",
umur: 25,
kota: "Jakarta"
};
const values = Object.values(user);
console.log(values); // ["Budi", 25, "Jakarta"]
values.forEach(value => {
console.log(value);
});
Object.entries() - Ambil Array of [Key, Value] Pairs
const user = {
nama: "Budi",
umur: 25,
kota: "Jakarta"
};
const entries = Object.entries(user);
console.log(entries);
// [["nama", "Budi"], ["umur", 25], ["kota", "Jakarta"]]
entries.forEach(([key, value]) => {
console.log(key + ": " + value);
});
Atau lebih elegan pake for...of:
for (const [key, value] of Object.entries(user)) {
console.log(key + ": " + value);
}
Perbandingan For...In vs Modern Methods
For...In (Old Way):
for (const key in user) {
if (user.hasOwnProperty(key)) {
console.log(key + ": " + user[key]);
}
}
Object.entries (Modern Way):
for (const [key, value] of Object.entries(user)) {
console.log(key + ": " + value);
}
Yang mana lebih bersih? Jelas yang modern kan?
Contoh Real World: Transform Object Data
Misalnya kamu mau convert object ke format lain:
Dengan For...In (Not Recommended):
const produk = {
nama: "Laptop",
harga: 10000000,
stok: 5
};
const hasil = [];
for (const key in produk) {
if (produk.hasOwnProperty(key)) {
hasil.push({
field: key,
value: produk[key]
});
}
}
Dengan Object.entries (Recommended):
const produk = {
nama: "Laptop",
harga: 10000000,
stok: 5
};
const hasil = Object.entries(produk).map(([key, value]) => ({
field: key,
value: value
}));
Lebih pendek, lebih aman, dan lebih mudah dipahami.
Kapan For...In Masih Boleh Dipake?
Sejujurnya, hampir gak ada use case modern yang benar-benar butuh for...in. Tapi kalau kamu kerja dengan legacy code atau ada requirement spesifik buat iterate prototype chain, baru deh for...in bisa jadi opsi.
Untuk 99% kasus lainnya, stick dengan:
Object.keys()kalau cuma butuh keysObject.values()kalau cuma butuh valuesObject.entries()kalau butuh keduanya
Kesimpulan For...In Loop
For...in adalah legacy loop yang sebaiknya dihindari di code modern. Behavior-nya yang iterate inherited properties bikin code kamu rawan bug. Untungnya JavaScript punya alternatif yang jauh lebih baik: Object.keys, Object.values, dan Object.entries.
Mulai sekarang, kalau kamu butuh iterate object, langsung pake salah satu dari tiga method itu. Code kamu bakal lebih aman, lebih bersih, dan lebih maintainable. Sekarang kita lanjut ke topik penting lainnya tentang loop: break dan continue statement.
Break & Continue - Control Flow dalam Loop

Kita udah sempet nyinggung break dan continue di pembahasan for loop sebelumnya. Sekarang waktunya kita bahas lebih dalam kedua statement ini karena mereka super penting buat ngontrol jalannya loop.
Break dan continue adalah tools yang kasih kamu kontrol lebih terhadap loop. Dengan mereka, kamu bisa stop loop kapan aja atau skip iterasi tertentu tanpa harus nunggu kondisi loop jadi false.
Break - Stop Loop Seketika
Statement break langsung menghentikan loop secara total. Begitu JavaScript ketemu break, loop langsung berakhir dan program lanjut ke code setelah loop.
for (let i = 0; i < 10; i++) {
if (i === 5) {
break;
}
console.log(i);
}
console.log("Loop selesai");
Output:
0
1
2
3
4
Loop selesai
Loop berhenti di angka 4, padahal kondisinya seharusnya jalan sampe 9. Begitu i jadi 5, break langsung stop semuanya.
Continue - Skip dan Lanjut
Beda sama break, continue gak stop loop. Statement ini cuma skip iterasi yang lagi berjalan terus langsung loncat ke iterasi berikutnya.
for (let i = 0; i < 5; i++) {
if (i === 2) {
continue;
}
console.log(i);
}
Output:
0
1
3
4
Angka 2 gak keprint karena waktu i sama dengan 2, continue langsung skip dan lanjut ke i = 3.
Perbedaan Break vs Continue
Biar lebih jelas, ini ilustrasi bedanya:
console.log("=== Dengan BREAK ===");
for (let i = 0; i < 5; i++) {
console.log("Mulai iterasi " + i);
if (i === 2) {
console.log("Ketemu break!");
break;
}
console.log("Selesai iterasi " + i);
}
console.log("\\n=== Dengan CONTINUE ===");
for (let i = 0; i < 5; i++) {
console.log("Mulai iterasi " + i);
if (i === 2) {
console.log("Ketemu continue!");
continue;
}
console.log("Selesai iterasi " + i);
}
Coba jalanin code ini dan perhatiin perbedaannya. Break bikin loop stop total, continue cuma skip bagian setelah continue tapi loop tetep jalan.
Use Case 1: Cari Item Pertama yang Match
Ini adalah use case paling umum buat break. Kalau kamu cuma butuh satu hasil dan gak perlu cek sisanya, pake break.
const users = [
{ id: 1, nama: "Budi", role: "user" },
{ id: 2, nama: "Ani", role: "admin" },
{ id: 3, nama: "Citra", role: "user" },
{ id: 4, nama: "Doni", role: "admin" }
];
let adminPertama = null;
for (const user of users) {
if (user.role === "admin") {
adminPertama = user;
break; // udah ketemu, gak perlu lanjut
}
}
console.log("Admin pertama:", adminPertama.nama); // Ani
Tanpa break, loop bakal terus jalan sampe akhir padahal kita udah nemu yang dicari di index ke-1.
Use Case 2: Skip Invalid Data
Continue berguna buat skip data yang gak valid atau gak perlu diproses.
const angka = [5, -2, 10, -8, 15, 0, 20];
console.log("Angka positif:");
for (const num of angka) {
if (num <= 0) {
continue; // skip angka negatif dan nol
}
console.log(num);
}
Output:
Angka positif:
5
10
15
20
Angka negatif dan nol di-skip, loop tetep jalan buat angka lainnya.
Use Case 3: Validasi dengan Multiple Conditions
const products = [
{ nama: "Laptop", harga: 10000000, stok: 5 },
{ nama: "Mouse", harga: 150000, stok: 0 },
{ nama: "Keyboard", harga: 500000, stok: 10 },
{ nama: "Monitor", harga: 2000000, stok: 3 }
];
console.log("Produk ready (stok > 0, harga < 5jt):");
for (const produk of products) {
// Skip kalau stok habis
if (produk.stok === 0) {
continue;
}
// Skip kalau harga terlalu mahal
if (produk.harga >= 5000000) {
continue;
}
console.log(`${produk.nama} - Rp ${produk.harga}`);
}
Output:
Produk ready (stok > 0, harga < 5jt):
Keyboard - Rp 500000
Monitor - Rp 2000000
Use Case 4: Cari Multiple Items dengan Limit
const scores = [45, 78, 92, 88, 55, 98, 67, 91];
const passing = [];
const passingScore = 75;
const maxResults = 3;
for (const score of scores) {
if (score >= passingScore) {
passing.push(score);
if (passing.length === maxResults) {
break; // udah dapet 3, stop
}
}
}
console.log("3 nilai pertama yang lulus:", passing);
// [78, 92, 88]
Kombinasi if dengan break bikin kita bisa ambil sejumlah data tertentu aja.
Break dan Continue di Nested Loop
Perlu hati-hati kalau pake break atau continue di nested loop. Statement ini cuma affect loop terdekat aja.
for (let i = 0; i < 3; i++) {
console.log("Outer loop: " + i);
for (let j = 0; j < 3; j++) {
if (j === 1) {
break; // cuma break inner loop
}
console.log(" Inner loop: " + j);
}
}
Output:
Outer loop: 0
Inner loop: 0
Outer loop: 1
Inner loop: 0
Outer loop: 2
Inner loop: 0
Break cuma nge-stop inner loop, outer loop tetep jalan normal.
Labeled Statement - Break Outer Loop
Kalau kamu butuh break outer loop dari dalam inner loop, pake labeled statement:
outerLoop: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) {
break outerLoop; // break outer loop
}
console.log(`i: ${i}, j: ${j}`);
}
}
Output:
i: 0, j: 0
i: 0, j: 1
i: 0, j: 2
i: 1, j: 0
Begitu kondisi terpenuhi, outer loop langsung stop. Tapi jujur aja, labeled statement jarang dipake dan bisa bikin code susah dibaca. Kalau bisa dihindari, better refactor ke function.
Tips Pake Break & Continue
Jangan Overuse - Terlalu banyak break dan continue bikin logic loop susah diikutin. Kalau udah terlalu kompleks, mending extract ke function terpisah.
Meaningful Conditions - Pastiin kondisi break/continue jelas dan gampang dipahami:
// Good
if (user.isAdmin) {
break;
}
// Bad
if (x === 1 && y > 5 || z !== null) {
break;
}
Consider Alternatives - Kadang filter atau find method lebih readable:
// Dengan break
let found = null;
for (const item of items) {
if (item.id === targetId) {
found = item;
break;
}
}
// Alternatif dengan find (lebih clean)
const found = items.find(item => item.id === targetId);
Break dan continue adalah tools yang powerful buat kontrol loop. Gunain dengan bijak buat bikin code yang efisien tapi tetep readable. Sekarang kita lanjut ke topik yang lebih advanced: nested loop.
Nested Loop - Loop di Dalam Loop

Nested loop adalah konsep dimana kamu punya loop di dalam loop lainnya. Outer loop jalan sekali, inner loop jalan berkali-kali. Outer loop jalan lagi, inner loop jalan berkali-kali lagi. Begitu seterusnya.
Konsep ini powerful banget buat ngolah data multidimensi kayak matrix atau 2D array. Tapi hati-hati, nested loop juga bisa jadi bumerang kalau gak dipake dengan bijak karena performance-nya.
Struktur Nested Loop
Bentuk paling simpel dari nested loop:
for (let i = 0; i < 3; i++) {
console.log("Outer loop: " + i);
for (let j = 0; j < 3; j++) {
console.log(" Inner loop: " + j);
}
}
Output:
Outer loop: 0
Inner loop: 0
Inner loop: 1
Inner loop: 2
Outer loop: 1
Inner loop: 0
Inner loop: 1
Inner loop: 2
Outer loop: 2
Inner loop: 0
Inner loop: 1
Inner loop: 2
Perhatiin polanya: setiap kali outer loop jalan sekali, inner loop jalan 3 kali lengkap.
Use Case 1: Matrix atau 2D Array
Nested loop paling sering dipake buat ngolah data 2 dimensi kayak tabel atau matrix.
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
console.log("Isi matrix:");
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
console.log(`Baris ${i}, Kolom ${j}: ${matrix[i][j]}`);
}
}
Outer loop iterate baris, inner loop iterate kolom. Perfect buat akses setiap elemen di matrix.
Use Case 2: Generate Multiplication Table
console.log("Tabel Perkalian 1-5:");
for (let i = 1; i <= 5; i++) {
let baris = "";
for (let j = 1; j <= 5; j++) {
baris += (i * j) + "\\t";
}
console.log(baris);
}
Output:
Tabel Perkalian 1-5:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Use Case 3: Compare Two Arrays
const team1 = ["Budi", "Ani", "Citra"];
const team2 = ["Doni", "Ani", "Eko"];
console.log("Member yang ada di kedua tim:");
for (const member1 of team1) {
for (const member2 of team2) {
if (member1 === member2) {
console.log(member1);
}
}
}
Output:
Member yang ada di kedua tim:
Ani
Performance Consideration: O(n²) Complexity
Ini bagian penting yang sering dilupain developer pemula. Nested loop punya kompleksitas O(n²), artinya kalau data makin besar, waktu eksekusinya naik eksponensial.
Ilustrasinya gini:
const small = [1, 2, 3]; // 3 items
const large = Array.from({length: 1000}, (_, i) => i); // 1000 items
console.time("Small nested loop");
for (const a of small) {
for (const b of small) {
// 3 x 3 = 9 iterasi
}
}
console.timeEnd("Small nested loop");
console.time("Large nested loop");
for (const a of large) {
for (const b of large) {
// 1000 x 1000 = 1,000,000 iterasi!
}
}
console.timeEnd("Large nested loop");
Data naik dari 3 ke 1000 items (333x lebih banyak), tapi total iterasi naik dari 9 ke 1 juta (111,111x lebih banyak). Gila kan?
Kapan Nested Loop Jadi Masalah?
Data Besar - Kalau outer dan inner loop sama-sama iterate ribuan data, aplikasi kamu bisa freeze.
Real-time Processing - Nested loop yang berat bakal bikin UI jadi lag atau unresponsive.
API Response - Server bakal lambat banget kalau harus proses nested loop dengan data besar.
Contoh kasus yang harus dihindari:
// BAHAYA: O(n²) complexity
const users = getUsersFromDatabase(); // 10,000 users
const posts = getPostsFromDatabase(); // 50,000 posts
for (const user of users) {
for (const post of posts) {
if (post.userId === user.id) {
// 10,000 x 50,000 = 500 juta iterasi!
}
}
}
Alternatif yang Lebih Efisien
Untuk kasus di atas, lebih baik pake Map atau Set:
// BETTER: O(n + m) complexity
const users = getUsersFromDatabase();
const posts = getPostsFromDatabase();
// Group posts by userId
const postsByUser = new Map();
for (const post of posts) {
if (!postsByUser.has(post.userId)) {
postsByUser.set(post.userId, []);
}
postsByUser.get(post.userId).push(post);
}
// Sekarang akses langsung tanpa nested loop
for (const user of users) {
const userPosts = postsByUser.get(user.id) || [];
// Proses userPosts
}
Dari 500 juta iterasi jadi cuma 60 ribu iterasi. Huge difference!
Avoid Deep Nesting
Nested loop lebih dari 2 level adalah red flag. Code jadi susah dibaca dan di-maintain.
// BAD: 3 level nesting
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].length; j++) {
for (let k = 0; k < data[i][j].length; k++) {
// what is this madness?
}
}
}
Kalau nemuin situasi kayak gini, refactor jadi function terpisah:
// BETTER: Extract ke function
function processRow(row) {
for (let j = 0; j < row.length; j++) {
processCell(row[j]);
}
}
function processCell(cell) {
for (let k = 0; k < cell.length; k++) {
// Proses data
}
}
for (let i = 0; i < data.length; i++) {
processRow(data[i]);
}
Atau lebih modern pake array methods:
// BEST: Functional approach
data.forEach(row => {
row.forEach(cell => {
cell.forEach(item => {
// Proses data
});
});
});
Nested Loop dengan Break & Continue
Kombinasi nested loop sama break/continue butuh extra attention. Inget, break cuma affect loop terdekat:
for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (j === 1) {
continue; // skip j = 1 di inner loop
}
if (i === 2 && j === 2) {
break; // break inner loop aja
}
console.log(`i: ${i}, j: ${j}`);
}
}
Tips Optimasi Nested Loop
Break Early - Kalau udah nemu yang dicari, langsung break:
let found = false;
for (const row of matrix) {
for (const cell of row) {
if (cell === target) {
found = true;
break;
}
}
if (found) break; // break outer loop juga
}
Reduce Iterations - Kalau bisa, kurangin jumlah iterasi:
// Daripada ini
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// n² iterasi
}
}
// Lebih baik ini (kalau sesuai logic)
for (let i = 0; i < n; i++) {
for (let j = i + 1; j < n; j++) {
// (n² - n) / 2 iterasi
}
}
Cache Length - Simpan length di variable buat avoid recalculation:
const rows = matrix.length;
for (let i = 0; i < rows; i++) {
const cols = matrix[i].length;
for (let j = 0; j < cols; j++) {
// Process
}
}
Nested loop powerful tapi dangerous. Pake dengan bijak, selalu consider performance, dan refactor kalau udah terlalu kompleks. Sekarang kita bahas salah satu masalah paling umum yang berhubungan sama loop: infinite loop.
Infinite Loop - Mimpi Buruk Developer

Infinite loop adalah situasi dimana loop jalan terus menerus tanpa henti. Browser freeze, tab crash, CPU usage naik drastis. Ini adalah salah satu bug paling frustrating yang bakal kamu temuin sebagai developer.
Kabar baiknya, infinite loop sebenarnya gampang dihindari kalau kamu tau penyebabnya dan cara mencegahnya. Mari kita bahas satu-satu.
Penyebab Utama Infinite Loop
Infinite loop terjadi kalau kondisi loop gak pernah jadi false. Loop terus ngecek kondisi, dan kondisinya terus true, jadi loop gak pernah berhenti.
Penyebab 1: Lupa Update Counter
let i = 0;
while (i < 5) {
console.log(i);
// BAHAYA: lupa i++
}
Nilai i gak pernah naik, jadi i < 5 selalu true. Loop jalan forever.
Penyebab 2: Update Counter yang Salah
for (let i = 0; i < 10; i--) {
console.log(i);
// BAHAYA: i-- bikin i makin kecil, kondisi selalu true
}
Harusnya i++ malah i--. Nilai i jadi -1, -2, -3, dst. Kondisi i < 10 gak bakal pernah false.
Penyebab 3: Kondisi yang Logically Impossible
let x = 1;
while (x > 0) {
console.log(x);
x++; // x makin besar, selalu > 0
}
Nilai x mulai dari 1 dan terus naik. Kondisi x > 0 gak mungkin false.
Penyebab 4: Typo di Kondisi
let count = 0;
while (count < 100) {
console.log(count);
countt++; // TYPO: harusnya count
}
Variable salah, jadi count gak pernah berubah.
While True dengan Break - Cara Aman
Kadang kamu emang sengaja pake while (true) untuk loop yang gak tau kapan berhentinya. Ini aman asalkan ada break statement.
let angka = 0;
while (true) {
angka++;
console.log(angka);
if (angka >= 5) {
break; // exit point yang jelas
}
}
console.log("Loop selesai");
Loop ini aman karena ada kondisi yang pasti akan terpenuhi dan ada break buat keluar.
Contoh Real World: Game Loop
let gameRunning = true;
while (gameRunning) {
// Update game state
updateGame();
// Render frame
render();
// Check kondisi game over
if (player.health <= 0) {
gameRunning = false; // exit loop
}
// Check user quit
if (userPressedEscape) {
break;
}
}
Meskipun kondisinya gameRunning, ada mekanisme jelas buat set jadi false atau break.
Tips Mencegah Infinite Loop
Tip 1: Selalu Update Counter atau Kondisi
Pastiin ada sesuatu di dalam loop yang bikin kondisi bisa jadi false:
// GOOD
let i = 0;
while (i < 10) {
console.log(i);
i++; // Update counter
}
// GOOD
let dataReady = false;
while (!dataReady) {
dataReady = checkData(); // Update kondisi
}
Tip 2: Double Check Logic
Sebelum jalanin loop, cek dulu logic-nya masuk akal:
// Cek: apakah kondisi bisa jadi false?
// Cek: apakah counter/variable bergerak ke arah yang benar?
for (let i = 10; i > 0; i--) {
// ✓ i mulai 10, turun ke 0, kondisi bakal false
}
Tip 3: Set Maximum Iterations
Buat safety net dengan limit maksimal:
let count = 0;
const maxIterations = 1000;
while (condition && count < maxIterations) {
// Your code here
count++;
}
if (count === maxIterations) {
console.error("Loop hit maximum iterations!");
}
Tip 4: Gunakan Debugger
Kalau curiga ada infinite loop, pake debugger statement:
let i = 0;
while (i < 5) {
debugger; // Browser pause disini
console.log(i);
i++;
}
Atau set breakpoint di browser DevTools buat track nilai variable setiap iterasi.
Safety: Test dengan Small Value Dulu
Jangan langsung test loop dengan data besar. Mulai dari yang kecil dulu.
// BAD: Langsung test dengan 1 juta
for (let i = 0; i < 1000000; i++) {
// code yang belum di-test
}
// GOOD: Test dengan 5 dulu
for (let i = 0; i < 5; i++) {
console.log(i);
// Pastiin loop jalan dengan benar
}
// Kalau udah yakin, baru naikin
for (let i = 0; i < 1000000; i++) {
// code yang udah di-test
}
Dengan cara ini, kalau ada infinite loop, browser cuma hang sebentar bukan sampe crash total.
Cara Recovery dari Infinite Loop
Kalau kamu gak sengaja bikin infinite loop dan browser freeze:
Di Browser:
- Tunggu beberapa detik, kadang browser kasih warning
- Klik "Stop Script" atau "Wait" kalau muncul dialog
- Close tab kalau browser masih responsive
- Force quit browser kalau udah gak bisa diklik
- Restart computer sebagai last resort
Di Code Editor:
- Stop development server (Ctrl+C di terminal)
- Fix code-nya
- Restart server
Prevention di Development:
// Add timeout buat development
let iterations = 0;
while (condition) {
iterations++;
if (iterations > 10000) {
console.error("Possible infinite loop detected!");
break;
}
// Your code
}
Common Infinite Loop Patterns to Avoid
Pattern 1: Nested Loop dengan Kondisi yang Sama
// BAHAYA
let i = 0;
while (i < 5) {
let j = 0;
while (j < 5) {
console.log(i, j);
i++; // Update counter di tempat yang salah!
}
}
Pattern 2: Async Operation di Loop
// BAHAYA: Loop gak nunggu async selesai
while (!dataLoaded) {
loadData(); // async function
// dataLoaded gak langsung true
}
Better pake async/await atau callback.
Pattern 3: Floating Point Comparison
// BAHAYA: Floating point precision issue
let x = 0.1;
while (x !== 1.0) {
x += 0.1; // 0.1 + 0.1 + ... mungkin gak exactly 1.0
}
Better pake < atau > daripada === buat floating point.
Debugging Infinite Loop
Kalau kamu suspect ada infinite loop tapi gak yakin dimana:
Teknik 1: Console.log Counter
let debugCount = 0;
while (condition) {
debugCount++;
if (debugCount % 100 === 0) {
console.log("Iteration:", debugCount);
}
// Your code
}
Kalau angkanya terus naik cepat banget, kemungkinan infinite loop.
Teknik 2: Performance Profiling
Buka DevTools > Performance tab, record, terus liat function mana yang makan waktu paling banyak.
Teknik 3: Add Timeout
const startTime = Date.now();
const timeout = 5000; // 5 seconds
while (condition) {
if (Date.now() - startTime > timeout) {
console.error("Loop timeout!");
break;
}
// Your code
}
Infinite loop adalah bug yang mudah dihindari dengan awareness dan testing yang proper. Selalu pastiin ada exit condition yang jelas, test dengan data kecil dulu, dan jangan lupa update counter atau kondisi di dalam loop. Sekarang kita masuk ke best practices yang bikin code loop kamu lebih professional.
Loop Best Practice - Menulis Loop yang Professional

Setelah kamu paham semua jenis loop dan perangkapnya, sekarang saatnya belajar cara menulis loop yang professional. Best practice ini hasil dari pengalaman ribuan developer dan bakal bikin code kamu lebih readable, maintainable, dan bug-free.
Menulis loop yang "jalan" itu gampang. Tapi menulis loop yang bersih dan mudah dipahami orang lain? Itu yang bikin perbedaan antara developer pemula dan professional.
Best Practice 1: Pilih Loop yang Tepat
Setiap jenis loop punya use case ideal masing-masing. Jangan pake for loop buat semua situasi.
Pake For Loop kalau iteration count sudah jelas:
// GOOD: Tau pasti mau 10 kali
for (let i = 0; i < 10; i++) {
console.log(i);
}
// BAD: Pake while padahal iteration count jelas
let i = 0;
while (i < 10) {
console.log(i);
i++;
}
Pake While Loop kalau fokus ke kondisi:
// GOOD: Fokus ke kondisi, bukan count
let password = "";
while (password.length < 8) {
password = prompt("Password minimal 8 karakter:");
}
// BAD: Pake for loop buat validasi
for (; password.length < 8; ) {
password = prompt("Password minimal 8 karakter:");
}
Pake For...Of untuk iterate array modern:
const users = ["Budi", "Ani", "Citra"];
// GOOD: Clean dan readable
for (const user of users) {
console.log(user);
}
// BAD: Manual index tracking
for (let i = 0; i < users.length; i++) {
console.log(users[i]);
}
Best Practice 2: Hindari For...In untuk Array
For...in dirancang buat object, bukan array. Kalau dipake di array, bakal iterate index sebagai string dan bisa iterate inherited properties.
const numbers = [10, 20, 30];
// BAD: For...in di array
for (const index in numbers) {
console.log(typeof index); // "string" - not what you want
console.log(numbers[index]);
}
// GOOD: For...of
for (const num of numbers) {
console.log(num);
}
// GOOD: Traditional for (kalau butuh index)
for (let i = 0; i < numbers.length; i++) {
console.log(i, numbers[i]);
}
Best Practice 3: Meaningful Variable Names
Nama variable yang jelas bikin code lebih self-documenting.
Counter Variables: i, j, k (acceptable)
// OK: i, j, k untuk simple counter
for (let i = 0; i < 10; i++) {
console.log(i);
}
// OK: Nested loop
for (let i = 0; i < rows; i++) {
for (let j = 0; j < cols; j++) {
console.log(matrix[i][j]);
}
}
Item Variables: descriptive names
// GOOD: Descriptive item name
const products = [...];
for (const product of products) {
console.log(product.name);
}
// BAD: Generic or confusing names
for (const x of products) {
console.log(x.name);
}
for (const product of users) { // confusing!
console.log(product.name);
}
Index Variables: descriptive when needed
// GOOD: Descriptive index ketika konteksnya kompleks
const students = [...];
for (let studentIndex = 0; studentIndex < students.length; studentIndex++) {
console.log(`Student ${studentIndex + 1}: ${students[studentIndex]}`);
}
// OK: Simple i kalau konteksnya jelas
for (let i = 0; i < students.length; i++) {
console.log(students[i]);
}
Best Practice 4: Keep Loop Body Simple
Loop body yang terlalu kompleks susah dibaca dan di-debug. Extract ke function kalau udah mulai rumit.
BAD: Complex logic dalam loop
const orders = [...];
for (const order of orders) {
// 50 baris code validasi, kalkulasi, transformasi
if (order.status === "pending") {
if (order.items.length > 0) {
let total = 0;
for (const item of order.items) {
if (item.discount) {
total += item.price * (1 - item.discount);
} else {
total += item.price;
}
}
order.total = total;
if (total > 1000000) {
order.shipping = "free";
} else {
order.shipping = 50000;
}
// ... masih banyak lagi
}
}
}
GOOD: Extract ke function
const orders = [...];
for (const order of orders) {
processOrder(order);
}
function processOrder(order) {
if (!isValidOrder(order)) return;
const total = calculateOrderTotal(order);
order.total = total;
order.shipping = calculateShipping(total);
}
function isValidOrder(order) {
return order.status === "pending" && order.items.length > 0;
}
function calculateOrderTotal(order) {
return order.items.reduce((sum, item) => {
const price = item.discount
? item.price * (1 - item.discount)
: item.price;
return sum + price;
}, 0);
}
function calculateShipping(total) {
return total > 1000000 ? "free" : 50000;
}
Jauh lebih readable kan? Setiap function punya single responsibility dan gampang di-test.
Best Practice 5: Cache Array Length
Kalau loop jalan berkali-kali dengan array yang sama, cache length-nya.
const items = getLargeArray();
// GOOD: Cache length
const length = items.length;
for (let i = 0; i < length; i++) {
processItem(items[i]);
}
// ALSO GOOD: Modern browsers optimize this anyway
for (let i = 0; i < items.length; i++) {
processItem(items[i]);
}
Tapi jujur, modern JavaScript engines udah otomatis optimize ini. Jadi gak wajib banget, tapi gak ada salahnya juga.
Best Practice 6: Avoid Modifying Array While Looping
Jangan tambah atau hapus item dari array yang lagi di-loop. Ini bikin behavior unpredictable.
const numbers = [1, 2, 3, 4, 5];
// BAD: Modify array during loop
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) {
numbers.splice(i, 1); // BAHAYA!
}
}
// GOOD: Create new array
const oddNumbers = [];
for (const num of numbers) {
if (num % 2 !== 0) {
oddNumbers.push(num);
}
}
// BETTER: Use filter
const oddNumbers = numbers.filter(num => num % 2 !== 0);
Best Practice 7: Consider Array Methods
Untuk operasi array yang umum, array methods sering lebih ekspresif daripada loop manual.
Transformation: map
// Manual loop
const doubled = [];
for (const num of numbers) {
doubled.push(num * 2);
}
// Better: map
const doubled = numbers.map(num => num * 2);
Filtering: filter
// Manual loop
const adults = [];
for (const user of users) {
if (user.age >= 18) {
adults.push(user);
}
}
// Better: filter
const adults = users.filter(user => user.age >= 18);
Aggregation: reduce
// Manual loop
let total = 0;
for (const item of cart) {
total += item.price;
}
// Better: reduce
const total = cart.reduce((sum, item) => sum + item.price, 0);
Tapi ingat, kalau butuh break atau continue, tetep pake traditional loop.
Best Practice 8: Add Comments for Complex Logic
Kalau logic loop memang harus kompleks, tambahin comment yang jelas.
// Process each chunk of data in batches to avoid memory issues
for (let i = 0; i < data.length; i += batchSize) {
const batch = data.slice(i, i + batchSize);
// API limit: max 100 items per request
if (batch.length > 100) {
console.warn("Batch exceeds API limit");
continue;
}
processBatch(batch);
}
Best Practice 9: Guard Clauses Early
Pake guard clauses di awal loop body buat avoid deep nesting.
// BAD: Deep nesting
for (const user of users) {
if (user.active) {
if (user.email) {
if (user.verified) {
sendEmail(user);
}
}
}
}
// GOOD: Guard clauses
for (const user of users) {
if (!user.active) continue;
if (!user.email) continue;
if (!user.verified) continue;
sendEmail(user);
}
Best Practice 10: Consistent Style
Pilih satu style dan stick to it di seluruh codebase.
// Pick one and be consistent
// Style 1: For...of when possible
for (const item of items) { }
// Style 2: Traditional for with index
for (let i = 0; i < items.length; i++) { }
// Style 3: forEach
items.forEach(item => { });
Yang penting konsisten dengan team kamu dan codebase yang ada.
Checklist: Review Loop Kamu
Sebelum commit code, cek loop kamu dengan pertanyaan ini:
- Apakah jenis loop-nya sudah tepat untuk use case ini?
- Apakah nama variable-nya jelas dan meaningful?
- Apakah ada potensi infinite loop?
- Apakah loop body-nya cukup simple atau perlu extract ke function?
- Apakah ada array method yang lebih cocok?
- Apakah loop-nya efficient (gak ada nested loop yang gak perlu)?
- Apakah ada comment buat logic yang kompleks?
Kalau semua jawabnya "yes", loop kamu udah siap production!
Best practice ini mungkin terlihat banyak, tapi seiring waktu bakal jadi second nature. Kamu bakal otomatis nulis loop yang bersih tanpa mikir lagi. Sekarang kita lanjut ke common mistakes yang sering bikin developer stuck.
Common Mistakes - Jebakan yang Sering Dialami Developer

Bahkan developer berpengalaman pun kadang masih kena jebakan loop. Di section ini kita bahas kesalahan umum, cara ngenalinnya, dan cara ngatasinya.
Mistake 1: Infinite Loop - Lupa Increment atau Update
Ini adalah kesalahan paling klasik dan paling sering bikin developer panik.
Contoh Kesalahan:
let i = 0;
while (i < 10) {
console.log(i);
// Lupa i++
}
// Browser freeze!
Cara Mengenali:
- Browser tab jadi unresponsive
- Console terus print output tanpa henti
- CPU usage naik drastis
Solusi:
let i = 0;
while (i < 10) {
console.log(i);
i++; // Jangan lupa!
}
Prevention Tip: Begitu nulis while loop, langsung tambahin increment/update statement sebelum nulis logic lainnya.
Mistake 2: Off-by-One Error - Loop Kurang atau Lebih
Off-by-one error terjadi kalau loop jalan satu kali kurang atau lebih dari yang seharusnya.
Loop Kurang:
const items = ["a", "b", "c", "d", "e"];
// SALAH: Cuma loop 4 kali
for (let i = 0; i < items.length - 1; i++) {
console.log(items[i]);
}
// Output: a, b, c, d (e gak keprint)
Loop Lebih:
const items = ["a", "b", "c"];
// SALAH: Loop 4 kali, harusnya 3
for (let i = 0; i <= items.length; i++) {
console.log(items[i]);
}
// Output: a, b, c, undefined
Solusi:
// BENAR
for (let i = 0; i < items.length; i++) {
console.log(items[i]);
}
Prevention: Pake < bukan <= kalau mulai dari 0, atau pake for...of buat avoid index management.
Mistake 3: Break atau Continue di Place yang Salah
Break Terlalu Awal:
const numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (const num of numbers) {
if (num > 3) {
break; // Stop terlalu cepat
}
sum += num;
}
console.log(sum); // 6, harusnya 15
Continue yang Skip Logic Penting:
const users = [
{ name: "Budi", age: 25 },
{ name: "Ani", age: 17 },
{ name: "Citra", age: 30 }
];
for (const user of users) {
if (user.age < 18) {
continue;
}
console.log(user.name);
user.verified = true; // Ani gak di-set verified
}
Solusi:
// Inverse kondisi lebih jelas
for (const user of users) {
if (user.age >= 18) {
console.log(user.name);
user.verified = true;
}
}
Prevention: Sebelum pake break/continue, pikir: "Apa yang terjadi kalau kondisi ini true?"
Mistake 4: Nested Loop Tanpa Perlu
Nested loop punya performance cost besar. Kadang ada cara lebih efisien.
Inefficient: O(n × m)
const users = getUsers(); // 1000 users
const orders = getOrders(); // 5000 orders
// 5,000,000 iterations!
for (const user of users) {
user.orders = [];
for (const order of orders) {
if (order.userId === user.id) {
user.orders.push(order);
}
}
}
Efficient: O(n + m)
// Group orders by userId first
const ordersByUser = new Map();
for (const order of orders) {
if (!ordersByUser.has(order.userId)) {
ordersByUser.set(order.userId, []);
}
ordersByUser.get(order.userId).push(order);
}
// Then assign to users
for (const user of users) {
user.orders = ordersByUser.get(user.id) || [];
}
Dari 5 juta iterasi jadi cuma 6000 iterasi!
Prevention: Sebelum nulis nested loop, tanya: "Apakah data bisa di-index dulu dengan Map/Set?"
Mistake 5: Typo di Variable atau Kondisi
Typo di Increment:
for (let count = 0; count < 10; count++) {
console.log(count);
countt++; // Typo: harusnya count
}
// Infinite loop!
Typo di Kondisi:
const items = [1, 2, 3, 4, 5];
for (let i = 0; i < items.lenght; i++) { // lenght vs length
console.log(items[i]);
}
// Loop gak jalan
Prevention: Pake linter (ESLint), enable strict mode, atau TypeScript.
Mistake 6: Modifying Array During Iteration
Nambah atau hapus item dari array yang lagi di-loop bikin index jadi kacau.
Kesalahan:
const numbers = [1, 2, 3, 4, 5];
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] % 2 === 0) {
numbers.splice(i, 1); // Hapus element
}
}
console.log(numbers); // [1, 3, 5] - Tapi 4 gak kehapus!
Kenapa angka 4 gak kehapus? Karena setelah angka 2 dihapus, index bergeser. Angka 3 yang tadinya di index 2 sekarang di index 1, tapi loop udah lanjut ke index 2 (yang sekarang angka 4).
Solusi: Filter ke Array Baru
const numbers = [1, 2, 3, 4, 5];
const oddNumbers = numbers.filter(num => num % 2 !== 0);
console.log(oddNumbers); // [1, 3, 5] - Correct!
Mistake 7: Wrong Loop Type
Awkward: For Loop untuk Simple Array
const fruits = ["apple", "banana", "orange"];
// Awkward
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// Better
for (const fruit of fruits) {
console.log(fruit);
}
Awkward: While Loop dengan Counter Jelas
// Awkward
let i = 0;
while (i < 10) {
console.log(i);
i++;
}
// Better
for (let i = 0; i < 10; i++) {
console.log(i);
}
Tips Debug Loop dengan Console.log
Log Counter:
for (let i = 0; i < items.length; i++) {
console.log("Iteration:", i);
}
Log Kondisi:
while (count < limit) {
console.log("Count:", count, "Limit:", limit);
count++;
}
Log Before/After:
for (const item of items) {
console.log("Before:", item);
const result = processItem(item);
console.log("After:", result);
}
Conditional Logging:
for (let i = 0; i < 1000; i++) {
if (i % 100 === 0) {
console.log("Progress:", i);
}
}
Log dengan Label:
for (let i = 0; i < 3; i++) {
console.log("OUTER:", i);
for (let j = 0; j < 3; j++) {
console.log(" INNER:", j);
}
}
Checklist Debug Loop
Kalau loop gak berfungsi:
- Apakah counter/kondisi di-update?
- Apakah kondisi loop benar?
- Apakah break/continue di tempat yang tepat?
- Apakah ada typo?
- Apakah array dimodifikasi selama loop?
- Apakah loop type sudah sesuai?
Dengan console.log dan checklist ini, kamu bisa fix kebanyakan bug loop dengan cepat. Sekarang waktunya test pemahaman kamu dengan challenge!
Challenge - Saatnya Praktek!

Kamu udah belajar semua tentang loop di JavaScript. Sekarang waktunya test pemahaman kamu dengan beberapa challenge. Coba kerjain sendiri dulu sebelum liat solusinya ya!
Challenge 1: Print Number 1-10
Task: Buat program yang print angka 1 sampai 10 ke console.
Expected Output:
1
2
3
4
5
6
7
8
9
10
Solusi:
// Solusi 1: For loop
for (let i = 1; i <= 10; i++) {
console.log(i);
}
// Solusi 2: While loop
let num = 1;
while (num <= 10) {
console.log(num);
num++;
}
// Solusi 3: Do-while loop
let number = 1;
do {
console.log(number);
number++;
} while (number <= 10);
Ketiga solusi ini valid. Tapi untuk kasus kayak gini, for loop paling cocok karena iteration count-nya jelas.
Challenge 2: Find First Even Number > 5
Task: Dari array [1, 3, 7, 4, 8, 2, 9, 6], cari angka genap pertama yang lebih besar dari 5. Print angkanya dan stop loop.
Expected Output:
Found: 8
Solusi:
const numbers = [1, 3, 7, 4, 8, 2, 9, 6];
// Solusi 1: For loop dengan break
for (let i = 0; i < numbers.length; i++) {
if (numbers[i] > 5 && numbers[i] % 2 === 0) {
console.log("Found:", numbers[i]);
break;
}
}
// Solusi 2: For...of dengan break
for (const num of numbers) {
if (num > 5 && num % 2 === 0) {
console.log("Found:", num);
break;
}
}
// Solusi 3: Array method find
const result = numbers.find(num => num > 5 && num % 2 === 0);
console.log("Found:", result);
For...of dengan break adalah pilihan paling clean. Array method find juga bagus tapi itu materi lain.
Challenge 3: Iterate Array dengan For dan For...Of
Task: Punya array ["apple", "banana", "orange", "grape"]. Print setiap buah dengan dua cara: pake for loop tradisional dan for...of loop.
Expected Output:
=== With For Loop ===
0: apple
1: banana
2: orange
3: grape
=== With For...Of Loop ===
apple
banana
orange
grape
Solusi:
const fruits = ["apple", "banana", "orange", "grape"];
// Cara 1: Traditional for loop
console.log("=== With For Loop ===");
for (let i = 0; i < fruits.length; i++) {
console.log(i + ": " + fruits[i]);
}
console.log("\\n=== With For...Of Loop ===");
// Cara 2: For...of loop
for (const fruit of fruits) {
console.log(fruit);
}
Perhatiin perbedaannya:
- For loop: bisa akses index dan value
- For...of: cuma value, lebih simple
Bonus Challenge: FizzBuzz
Kalau kamu mau challenge lebih, coba klasik FizzBuzz problem:
Task: Print angka 1-15 dengan aturan:
- Kalau angka habis dibagi 3, print "Fizz"
- Kalau angka habis dibagi 5, print "Buzz"
- Kalau angka habis dibagi 3 dan 5, print "FizzBuzz"
- Kalau gak habis dibagi keduanya, print angkanya
Expected Output:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
Solusi:
for (let i = 1; i <= 15; i++) {
if (i % 3 === 0 && i % 5 === 0) {
console.log("FizzBuzz");
} else if (i % 3 === 0) {
console.log("Fizz");
} else if (i % 5 === 0) {
console.log("Buzz");
} else {
console.log(i);
}
}
Tips: Harus cek kondisi i % 3 === 0 && i % 5 === 0 duluan sebelum cek kondisi individual. Kalau kebalik, bakal print "Fizz" atau "Buzz" aja, bukan "FizzBuzz".
Bonus Challenge 2: Sum Array
Task: Hitung total dari semua angka di array [10, 20, 30, 40, 50].
Expected Output:
Total: 150
Solusi:
const numbers = [10, 20, 30, 40, 50];
let total = 0;
// Solusi 1: For loop
for (let i = 0; i < numbers.length; i++) {
total += numbers[i];
}
console.log("Total:", total);
// Solusi 2: For...of
let sum = 0;
for (const num of numbers) {
sum += num;
}
console.log("Total:", sum);
// Solusi 3: Reduce (advanced)
const result = numbers.reduce((acc, num) => acc + num, 0);
console.log("Total:", result);
Kesimpulan Loop
Selamat! Kamu udah menyelesaikan pembelajaran tentang loop di JavaScript. Ini adalah fondasi penting yang bakal kamu pake terus dalam programming journey kamu.
Recap singkat:
- For loop: Iteration count jelas
- While loop: Fokus ke kondisi
- Do-while: Execute minimal sekali
- For...of: Modern way iterate array
- For...in: Hindari untuk array
- Break & Continue: Kontrol flow loop
- Nested loop: Hati-hati performance
Loop adalah salah satu konsep yang makin bagus dengan praktek. Jadi jangan cuma baca, tapi praktekin terus dengan bikin program-program kecil.
Next: Functions
Di episode berikutnya, kita bakal belajar tentang Functions - cara bikin code yang reusable dan organized. Functions bakal ngebuat code kamu lebih modular dan gampang di-maintain.
Kalau kamu mau belajar lebih dalam tentang JavaScript dan web development, jangan lupa cek course-course lainnya di BuildWithAngga. Ada banyak materi dari basic sampe advanced yang bisa ngebantu journey kamu jadi developer professional.
Keep coding, keep learning, dan jangan takut buat eksperimen dengan loop-loop yang udah kamu pelajari. See you di episode berikutnya!