JavaScript
Loop Arrays & Objects
for...of กับ array
เรียนรู้ว่า `for...of` เหมาะกับ array เพราะรับค่า element โดยตรง เขียนสั้น อ่านง่าย และใช้ได้ดีกับงานวนอ่านค่า สะสมค่า และคัดเลือกข้อมูล
for...of กับ array — ได้ค่า element โดยตรง ไม่ต้องผ่าน index
`for...of` คือ syntax ที่เหมาะมากกับ array เมื่อคุณต้องการ **ค่าของแต่ละ element** ทีละตัว จุดเด่นคือไม่ต้องจัดการ `i`, ไม่ต้องเขียนเงื่อนไข `i < arr.length` และไม่ต้องหยิบค่าด้วย `arr[i]` เอง ทำให้โค้ดสั้นลงและอ่านง่ายขึ้น
ทั้งสองแบบให้ผลลัพธ์เหมือนกัน — for...of สั้นกว่าและไม่มีความเสี่ยง off-by-one
const fruits = ["apple", "banana", "cherry"];
// for loop แบบเดิม — ต้องจัดการ index เอง
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// for...of — ได้ค่าโดยตรง สั้นกว่า อ่านง่ายกว่า
for (const fruit of fruits) {
console.log(fruit);
}
// "apple"
// "banana"
// "cherry"for...of ตัด i, เงื่อนไข และ arr[i] ออก — เหลือแค่ชื่อที่อยากเรียกแต่ละ element
Syntax ของ for...of — แต่ละส่วนทำหน้าที่อะไร
syntax พื้นฐานของ `for...of` มีหน้าที่ชัดเจนมาก: ประกาศตัวแปรสำหรับค่าปัจจุบัน บอกว่ากำลังวนผ่านข้อมูล และใส่โค้ดที่ต้องรันในแต่ละรอบ
โครงนี้ตั้งใจให้จำว่าแต่ละรอบเราได้ `item` ซึ่งเป็นค่าปัจจุบันของ array โดยตรง
for (const item of array) {
// ใช้ item ที่นี่
}- `const item` รับค่า element ของรอบนั้น
- `of` แปลว่ากำลังวนผ่านข้อมูลทีละค่า
- `array` คือ array ที่ต้องการวน
- body คือโค้ดที่รันทุกรอบ โดย `item` จะเปลี่ยนไปตามค่าถัดไปใน array
ตั้งชื่อตัวแปรให้สื่อความหมาย — `score`, `item`, `fruit`, `price` — ทำให้โค้ดอ่านเข้าใจง่ายขึ้น
const scores = [88, 75, 92, 61, 100];
for (const score of scores) {
console.log(score);
}
// 88
// 75
// 92
// 61
// 100- ตั้งชื่อตัวแปรให้สื่อกับข้อมูล เช่น `fruit`, `score`, `price`
- ส่วนใหญ่ใช้ `const` ได้เลย เพราะเราไม่ได้ reassign ตัวแปรของแต่ละรอบ
- ให้คิดว่าแต่ละรอบเราได้ “ค่าปัจจุบัน” มาใช้งานทันที
รูปแบบงานที่เหมาะกับ for...of
`for...of` เหมาะมากกับงานที่อ่านค่าทีละตัวจาก array แล้วทำอะไรบางอย่างต่อ เช่น แสดงข้อมูล, สะสมผลรวม, หรือคัดเฉพาะค่าที่ตรงเงื่อนไข
งานสะสมค่าอ่านง่ายขึ้น เพราะในแต่ละรอบเราได้ `score` มาใช้เลย
const scores = [88, 75, 92, 61, 100];
let total = 0;
for (const score of scores) {
total += score;
}
console.log(total); // 416เวลาคัดค่าตามเงื่อนไข `for...of` ทำให้เราสนใจแค่ `price` ของรอบนั้น
const prices = [120, 450, 80, 300, 890, 200];
const affordable = [];
for (const price of prices) {
if (price <= 300) {
affordable.push(price);
}
}
console.log(affordable); // [120, 80, 300, 200]เมื่อต้องการ index ให้ใช้ for loop แบบเดิม
`for...of` ไม่ให้ index โดยตรง — ถ้าต้องการรู้ว่า element อยู่ตำแหน่งที่เท่าไหร่ หรือต้องการแก้ไขค่าใน array โดยตรง ให้ใช้ for loop แบบเดิมที่ใช้ `i`
เมื่อต้องการลำดับที่, ตำแหน่ง, หรือแก้ไขค่าใน array ให้ใช้ for loop กับ index แทน
const names = ["Alice", "Bob", "Charlie"];
// ❌ for...of — ไม่รู้ index
for (const name of names) {
// อยากแสดง "1. Alice" แต่ไม่มี index ให้ใช้
}
// ✅ for loop — มี index
for (let i = 0; i < names.length; i++) {
console.log((i + 1) + ". " + names[i]);
}
// "1. Alice"
// "2. Bob"
// "3. Charlie"| for loop `(i)` | for...of | |
|---|---|---|
| ได้ index | ✓ | ✗ |
| ได้ค่า element โดยตรง | ต้องผ่าน `arr[i]` | ✓ (ได้เลย) |
| แก้ไขค่าใน array | ✓ `arr[i] = ...` | ✗ (ไม่มีผลกับ array) |
| อ่านง่าย | ปานกลาง | ✓ สั้นกว่า |
| เสี่ยง off-by-one | ✓ (ต้องระวัง) | ✗ (ไม่มีเลย) |
หมายเหตุสั้น ๆ — `for...of` ใช้กับ string ได้ด้วย
นอกจาก array แล้ว `for...of` ยังใช้กับ string ได้ โดยจะวนทีละ character แต่ใน phase นี้ให้โฟกัสหลักที่ array ก่อน เพื่อให้เลือกเครื่องมือให้ตรงกับ data structure ได้ชัดเจน
เก็บไว้เป็นภาพจำว่า `for...of` วน “ทีละค่า” ของ iterable ได้ ไม่ได้จำกัดแค่ array
const word = "hello";
for (const char of word) {
console.log(char);
}
// "h"
// "e"
// "l"
// "l"
// "o"