JavaScript Fundamental: Loops - Eps 3

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

JavaScript Fundamental_ Loops - Eps 3 and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_10_37.png

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

Section 02_ For Loop and 8 more pages - Personal - Microsoft Edge 23_12_2025 13_12_15.png

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

JavaScript Fundamental_ Loops - Eps 3 and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_13_32.png

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

JavaScript fundamental_ loops - Claude and 8 more pages - Personal - Microsoft Edge 23_12_2025 13_14_31.png

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 break dan continue
  • 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

Section 06_ For...In Loop and 8 more pages - Personal - Microsoft Edge 23_12_2025 13_15_37.png

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 keys
  • Object.values() kalau cuma butuh values
  • Object.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

Section 07_ Break TITLE_PLACEHOLDER Continue and 8 more pages - Personal - Microsoft Edge 23_12_2025 13_17_51.png

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

JavaScript fundamental_ loops - Claude and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_19_05.png

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

JavaScript Fundamental_ Loops - Eps 3 and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_20_34.png

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:

  1. Tunggu beberapa detik, kadang browser kasih warning
  2. Klik "Stop Script" atau "Wait" kalau muncul dialog
  3. Close tab kalau browser masih responsive
  4. Force quit browser kalau udah gak bisa diklik
  5. Restart computer sebagai last resort

Di Code Editor:

  1. Stop development server (Ctrl+C di terminal)
  2. Fix code-nya
  3. 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

JavaScript Fundamental_ Loops - Eps 3 and 8 more pages - Personal - Microsoft Edge 23_12_2025 13_21_49.png

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:

  1. Apakah jenis loop-nya sudah tepat untuk use case ini?
  2. Apakah nama variable-nya jelas dan meaningful?
  3. Apakah ada potensi infinite loop?
  4. Apakah loop body-nya cukup simple atau perlu extract ke function?
  5. Apakah ada array method yang lebih cocok?
  6. Apakah loop-nya efficient (gak ada nested loop yang gak perlu)?
  7. 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

JavaScript Fundamental_ Loops - Eps 3 and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_23_00.png

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:

  1. Apakah counter/kondisi di-update?
  2. Apakah kondisi loop benar?
  3. Apakah break/continue di tempat yang tepat?
  4. Apakah ada typo?
  5. Apakah array dimodifikasi selama loop?
  6. 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!

JavaScript Fundamental_ Loops - Eps 3 and 7 more pages - Personal - Microsoft Edge 23_12_2025 13_24_51.png

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!