คอร์ส IT พื้นฐาน JavaScript 042_ลูป while、for
คำสั่งลูปเป็นวิธีการที่ใช้ในการรันบลอกโค้ดซ้ำๆ JavaScript จัดเตรียมคำสั่งลูปประเภทต่างๆ เช่น while, do-while, for เป็นต้น
ตัวลูปที่สมบูรณ์ประกอบด้วย: นิพจน์เริ่มต้น, เงื่อนไขลูป และตัววนซ้ำ
ลูป while
ลูป while ใช้สำหรับรันบลอกโค้ดซ้ำๆ เมื่อเงื่อนไขเป็น true
การรันเดียวของตัวลูปเรียกว่า หนึ่งรอบการวนซ้ำ
นิพจน์หรือตัวแปรใดๆ สามารถเป็นเงื่อนไขลูปได้ เงื่อนไขลูปจะถูกคำนวณและผลลัพธ์จะถูกแปลงเป็นค่าบูลีน
เช่นเดียวกับ if หากตัวลูปมีเพียงคำสั่งเดียว คุณสามารถละเว้นวงเล็บปีกกา {…} ได้ แต่ไม่แนะนำให้ทำเช่นนั้น
เงื่อนไขจะถูกตรวจสอบก่อนการวนซ้ำแต่ละครั้ง
ตัวอย่าง:
let i = 0; // นิพจน์เริ่มต้น, โดยทั่วไปใช้สำหรับประกาศตัวแปรตัวนับ, ถ้าไม่มีจะเกิดข้อผิดพลาด undefinedwhile (i < 5) { // เงื่อนไขลูป, ถ้าเป็น `true` ลูปจะทำงานต่อไป console.log(i); i++; // ตัววนซ้ำ, โดยทั่วไปใช้สำหรับอัปเดตตัวแปรตัวนับให้ตรงกับเงื่อนไขลูป}ตัวอย่างลูปไม่มีที่สิ้นสุด:
let i = 0; while (1) { // เงื่อนไขเป็น true เสมอจะเข้าสู่ลูปไม่มีที่สิ้นสุด console.log(i); i++; // โดยทั่วไปใช้รูปแบบนี้ในการอัปเดตตัวนับสำหรับเงื่อนไขลูป if (i >= 5) break; // หากคอมเมนต์บรรทัดนี้จะเข้าสู่โหมดลูปไม่มีที่สิ้นสุด}ลูป do-while
ลูป do-while คล้ายกับลูป while แต่จะรันตัวลูปหนึ่งครั้งก่อน จากนั้นจึงตรวจสอบว่าเงื่อนไขเป็น true หรือไม่ ถ้าเงื่อนไขเป็นจริงจะทำงานต่อไป
ต้องใส่ใจกับสถานการณ์การใช้งาน ใช้ do-while เฉพาะเมื่อต้องการรันตัวลูป อย่างน้อยหนึ่งครั้ง ไม่ว่าเงื่อนไขจะเป็นจริงหรือไม่ สถานการณ์อื่นๆ แนะนำให้ใช้ลูป while
เงื่อนไขจะถูกตรวจสอบหลังจากการวนซ้ำแต่ละครั้ง
ตัวอย่าง:
let i = 0;do { console.log(i); i++;} while (i < 5);ลูป for
ลูป for เป็นโครงสร้างลูปที่ซับซ้อนกว่า แต่ก็เป็นที่ใช้กันมากที่สุด ใช้สำหรับรันบลอกโค้ดซ้ำๆ
ลูป for ประกอบด้วยสามส่วน: นิพจน์เริ่มต้น, เงื่อนไขลูป และตัววนซ้ำ ต่อไปนี้เป็นไวยากรณ์พื้นฐานของลูป for:
เงื่อนไขจะถูกตรวจสอบก่อนการวนซ้ำแต่ละครั้ง และสามารถใช้การตั้งค่าอื่นๆ ได้
ตัวอย่าง:
for (let i = 0; i < 5; i++) { console.log(i);}ตัวอย่างลูปไม่มีที่สิ้นสุด:
let i = 0; for ( ; ; ) { // การละเว้นเงื่อนไขทั้งหมดจะเข้าสู่ลูปไม่มีที่สิ้นสุด console.log(i); i++; // โดยทั่วไปใช้รูปแบบนี้ในการอัปเดตตัวนับสำหรับเงื่อนไขลูป if (i >= 5) break; // หากคอมเมนต์บรรทัดนี้จะเข้าสู่โหมดลูปไม่มีที่สิ้นสุด}การละเว้นส่วนของคำสั่ง
ลูป for สามารถละเว้นนิพจน์เริ่มต้น, เงื่อนไขลูป หรือตัววนซ้ำได้ส่วนใดส่วนหนึ่งหรือหลายส่วน แต่เครื่องหมายอัฒภาค ; จะต้องถูกเก็บไว้ เครื่องหมายอัฒภาคใช้สำหรับแยกแต่ละส่วน เมื่อละเว้นหนึ่งส่วนยังคงต้องเก็บเครื่องหมายอัฒภาคที่สอดคล้องกัน
ตัวอย่าง:
let x = 0;for (; x < 5; x++) { console.log(x);}// ละเว้นนิพจน์เริ่มต้น, ย้ายไปยังภายนอกลูป, ลูปยังคงใช้งานได้
let y = 0;for (;; y++) { if (y >= 5) { break; } console.log(y);}// ละเว้นเงื่อนไขลูป, ยุติลูปผ่านคำสั่ง `if` และ `break`
let z = 0;for (; z < 5;) { console.log(z); z++;}// ละเว้นตัววนซ้ำ, ตัววนซ้ำถูกย้ายเข้าไปในตัวลูป, ลูปยังคงใช้งานได้ลูปซ้อนกัน
ลูปซ้อนกันหมายถึงการมีโครงสร้างลูปที่สมบูรณ์อีกอันหนึ่งอยู่ภายในตัวลูป ลูปซ้อนกันจะรันลูปภายในหนึ่งครั้งทุกครั้งที่รันลูปภายนอก
ตัวอย่างสามเหลี่ยมปกติ:
// ตัวอย่าง Afor (let i = 1; i <= 5; i++) { // ลูปภายนอก, ควบคุมจำนวนแถว, จาก 1 ถึง 5 let row = ''; // ทุกครั้งที่รันลูปภายนอก, สร้างสตริงว่าง `row`, ใช้สำหรับเก็บดาวของแถวปัจจุบัน for (let j = 1; j <= i; j++) { // ลูปภายใน, ควบคุมจำนวนดาวในแต่ละแถว, จาก 1 ถึงจำนวนแถวปัจจุบัน `i` row += '⭐ '; // เพิ่มดาวลงใน `row`, สร้างสตริงดาวของแถวปัจจุบัน } console.log(row); // แสดงสตริงดาวของแถวปัจจุบัน}// ตัวอย่าง Bfor (let i = 1; i <= 5; i++) { // ลูปภายนอกแทนจำนวนแถว for (let j = 1; j <= i; j++) { // ลูปภายในแทนคอลัมน์ document.write('⭐'); // ใช้ดาวเป็นองค์ประกอบกราฟิก } document.write('</br>'); // ขึ้นบรรทัดใหม่}ตัวอย่างสามเหลี่ยมกลับหัว:
// ตัวอย่าง Afor (let i = 5; i >= 1; i--) { // ลูปภายนอก, ควบคุมจำนวนแถว, จาก 1 ถึง 5 let row = ''; // ทุกครั้งที่รันลูปภายนอก, สร้างสตริงว่าง `row`, ใช้สำหรับเก็บดาวของแถวปัจจุบัน for (let j = 1; j <= i; j++) { // ลูปภายใน, ควบคุมจำนวนดาวในแต่ละแถว, จาก 1 ถึงจำนวนแถวปัจจุบัน `i` row += '* '; // เพิ่มดาวลงใน `row`, สร้างสตริงดาวของแถวปัจจุบัน } console.log(row); // แสดงสตริงดาวของแถวปัจจุบัน}// ตัวอย่าง Bfor (let i = 1; i <= 5; i++) { // ลูปภายนอกแทนจำนวนแถว for (let j = 0; j <= 5 - i; j++) { // ลูปภายในแทนคอลัมน์ document.write('⭐'); // ใช้ดาวเป็นองค์ประกอบกราฟิก } document.write('</br>'); // ขึ้นบรรทัดใหม่}break ยุติ (จบ, ออกจาก) ลูป
break ใช้สำหรับยุติ (จบ, ออกจาก) ลูปปัจจุบันหรือคำสั่ง switch หากไม่มี break จะทำงาน case ต่อไป (เกิดปรากฏการณ์ “ทะลุผ่าน”)
การผสมผสาน “ลูปไม่มีที่สิ้นสุด + break” เหมาะสำหรับสถานการณ์ที่ไม่จำเป็นต้องตรวจสอบเงื่อนไขที่จุดเริ่มต้น/สิ้นสุดของลูป แต่ต้องตรวจสอบเงื่อนไขตรงกลางหรือแม้กระทั่งหลายตำแหน่งในตัว
ตัวอย่าง:
let count = 0;while (true) { console.log("อยู่ในลูป..."); // จำลองเงื่อนไข, เมื่อเงื่อนไขตรงตามจะออกจากลูป if (count === 5) { console.log("ตรงตามเงื่อนไข, ออกจากลูป"); break; } count++;}continue ดำเนินการต่อ (ข้าม) ลูปครั้งถัดไป
continue ใช้สำหรับยุติการวนซ้ำปัจจุบันก่อนกำหนดในลูป และดำเนินการวนซ้ำครั้งถัดไป
continue เป็น “เวอร์ชันเบา” ของ break มันไม่หยุดลูปทั้งหมด แต่หยุดการวนซ้ำปัจจุบันและบังคับให้เริ่มการวนซ้ำใหม่ (หากเงื่อนไขอนุญาต)
ตัวอย่าง:
for (let i = 0; i < 8; i++) { if (i % 2 === 0) { continue; // เมื่อ i หารเหลือ 2 เป็น 0 จะข้ามการวนซ้ำปัจจุบันและดำเนินการวนซ้ำครั้งถัดไป } console.log(i);}