JavaScript
Object
Bracket notation
เรียนรู้ bracket notation `object["key"]` — วิธีเข้าถึง property เมื่อ key มีอักขระพิเศษ การใช้ตัวแปรเป็น key แบบ dynamic และ expression ใน bracket
Bracket notation คือ `object["key"]` — อีกวิธีเข้าถึงค่าใน object ด้วย `[ ]`
bracket notation คือการเขียน `object["key"]` — ใส่ชื่อ key ในเครื่องหมาย **`[ ]`** โดยเขียน key เป็น **string** ภายใน `" "` หรือ `' '` JavaScript จะมองหา key ที่ตรงกับ string นั้นแล้วคืนค่าให้ เช่นเดียวกับ dot notation
ทั้ง `user.name` และ `user["name"]` ได้ผลลัพธ์เหมือนกัน
const user = { name: "สมชาย", age: 30, isAdmin: false };
// dot notation
console.log(user.name); // "สมชาย"
// bracket notation — เขียน key ใน " "
console.log(user["name"]); // "สมชาย"bracket notation เป็นวิธีที่ยืดหยุ่นกว่า dot notation เพราะรองรับ key ได้ทุกรูปแบบ — รวมถึง key ที่มีอักขระพิเศษ และการใช้ตัวแปรเป็น key แบบ dynamic
ใช้กับ key ที่ dot notation ใช้ไม่ได้ — ช่องว่าง ขีดกลาง ตัวเลขขึ้นต้น
dot notation ใช้ได้กับ **identifier key** เท่านั้น (ไม่มีช่องว่าง ไม่มีอักขระพิเศษ ไม่ขึ้นต้นด้วยตัวเลข) แต่ bracket notation **ไม่มีข้อจำกัดนี้** — ใส่ key แบบไหนก็ได้ที่เป็น string นี่คือการใช้ bracket notation ที่พบมากที่สุดในโค้ดจริง
key ที่มีขีดกลาง ช่องว่าง หรือขึ้นต้นด้วยตัวเลข — ใช้ได้กับ bracket notation เท่านั้น
const config = {
"dark-mode": true,
"font size": "16px",
"2ndOption": "advanced",
"full-name": "สมชาย ใจดี",
};
// bracket notation — รองรับทุก key
console.log(config["dark-mode"]); // true
console.log(config["font size"]); // "16px"
console.log(config["2ndOption"]); // "advanced"
console.log(config["full-name"]); // "สมชาย ใจดี"
// dot notation — ❌ error กับ key ที่มีอักขระพิเศษ
// config.dark-mode → SyntaxError (เข้าใจว่าเป็นลบ)
// config.2ndOption → SyntaxError (ขึ้นต้นด้วยตัวเลข)| key | dot notation | bracket notation | เพราะ |
|---|---|---|---|
| `"name"` | ✓ | ✓ | identifier ปกติ |
| `"dark-mode"` | ✗ | ✓ | มีขีดกลาง (`-`) เป็น operator |
| `"font size"` | ✗ | ✓ | มีช่องว่าง |
| `"2ndOption"` | ✗ | ✓ | ขึ้นต้นด้วยตัวเลข |
| `"full-name"` | ✗ | ✓ | มีขีดกลาง |
ใช้ตัวแปรเป็น key — dynamic access
จุดแข็งที่สุดของ bracket notation คือการใช้ **ตัวแปร** แทน string ตรง ๆ เป็น key — dot notation ทำแบบนี้ไม่ได้ เขียน `object[variableName]` — JavaScript จะอ่านค่าในตัวแปรแล้วใช้ string นั้นเป็น key
`object[ตัวแปร]` — JavaScript เอาค่าในตัวแปรมาใช้เป็น key
const profile = {
name: "สมหญิง",
email: "somying@email.com",
phone: "0812345678",
};
// ใช้ตัวแปรเป็น key
const field = "email";
console.log(profile[field]); // "somying@email.com"
// เปลี่ยนค่าตัวแปร → อ่านคนละ property ได้ทันที
const key = "phone";
console.log(profile[key]); // "0812345678"
// dot notation ใช้ตัวแปรเป็น key ไม่ได้
// profile.field → undefined (มองหา key ที่ชื่อ "field" จริง ๆ)dynamic access มีประโยชน์มากเวลารับชื่อ key จากผู้ใช้, จาก API, หรือการวนลูปอ่านค่าหลาย property โดยไม่ต้องเขียน `obj.name`, `obj.age` แยกทีละบรรทัด
เปลี่ยนตัวแปร key กับ bracket notation — ไม่ต้องเขียน `student.name`, `student.score` ทีละบรรทัด
const student = { name: "ก้อง", score: 85, grade: "A" };
// อ่านหลาย property โดยเปลี่ยนตัวแปร key ทีละตัว
const key1 = "name";
console.log(key1 + ":", student[key1]); // name: ก้อง
const key2 = "score";
console.log(key2 + ":", student[key2]); // score: 85
const key3 = "grade";
console.log(key3 + ":", student[key3]); // grade: Aใช้ expression ใน bracket ได้ — ไม่ใช่แค่ string หรือตัวแปรตรง ๆ
ภายใน `[ ]` ของ bracket notation ใส่ expression อะไรก็ได้ที่ประเมินแล้วเป็น string — ต่อ string, เรียกฟังก์ชัน, หรือใช้ ternary ได้ทั้งหมด
expression ใน `[ ]` ต้องประเมินแล้วได้ string — ถ้าได้ number JavaScript จะแปลงเป็น string ให้อัตโนมัติ
const data = {
score1: 85,
score2: 90,
score3: 78,
};
// ต่อ string เป็น key ใน bracket
const round = 2;
console.log(data["score" + round]); // 90 → "score" + 2 = "score2"
// expression ใน bracket — ใช้ || (logical OR) เป็น fallback
const key = "color";
const fallback = "name";
const item = { name: "ดินสอ" };
console.log(item[key || fallback]); // "ดินสอ" — color ไม่มี เลยใช้ชื่อ key "name"- **ต่อ string:** `obj["prefix" + suffix]` — สร้าง key จากหลายส่วนเข้าด้วยกัน
- **expression:** `obj[keyA || keyB]` — เลือก key ตามเงื่อนไข
- **ฟังก์ชัน:** `obj[getKeyName()]` — ให้ฟังก์ชันคืนชื่อ key มา
- ข้อควรระวัง: ถ้า expression ใน `[ ]` ไม่ได้เป็น string, number, หรือ symbol — JavaScript จะเรียก `.toString()` โดยอัตโนมัติ ได้ผลลัพธ์เป็น `"[object Object]"` ซึ่งมักไม่ใช่สิ่งที่ต้องการ
ข้อแตกต่างสำคัญ — dot vs bracket notation สรุป
| เรื่อง | Dot Notation | Bracket Notation |
|---|---|---|
| รูปแบบ | `object.key` | `object["key"]` |
| key มีช่องว่าง/อักขระพิเศษ | ✗ ใช้ไม่ได้ | ✓ ใช้ได้ (เขียนเป็น string) |
| ใช้ตัวแปรเป็น key | ✗ ใช้ไม่ได้ | ✓ ใช้ได้ |
| ใช้ expression ใน key | ✗ ใช้ไม่ได้ | ✓ ใช้ได้ |
| ความกระชับ | สั้น อ่านง่าย | ยาวกว่าแต่ยืดหยุ่นกว่า |
| ใช้เมื่อไหร่ | key เป็น identifier ธรรมดา — เป็น default choice | key มีอักขระพิเศษ หรือต้องการ dynamic access |
สรุปแนวทางเลือกใช้: • ถ้า key เป็นชื่อธรรมดา (identifier) — เลือก **dot notation** ก่อน เพราะสั้นและอ่านง่าย • ถ้า key มีอักขระพิเศษหรือขึ้นต้นด้วยตัวเลข — ใช้ **bracket notation** • ถ้าต้องการใช้ตัวแปรหรือ expression เป็น key — ใช้ **bracket notation** เท่านั้น