JavaScript
Object
อัปเดต property
เรียนรู้การอัปเดตค่า property ใน object ด้วย dot notation, bracket notation, computed value, computed key, การอัปเดตตามเงื่อนไขด้วย `if`/`if...else`, การใช้ `in` เช็กก่อนอัปเดต และข้อควรระวังเรื่อง `const` object — พร้อม workshop ที่ครอบคลุมทุก pattern การอัปเดต
อัปเดตค่าเดิม — assign ค่าใหม่ให้ key ที่มีอยู่แล้ว
การอัปเดตใช้ syntax เดียวกับการเพิ่ม — `object.key = newValue` หรือ `object["key"] = newValue` ข้อแตกต่างคือ key นั้นมีอยู่แล้วใน object — JavaScript จะ **เขียนทับ** ค่าเดิมด้วยค่าใหม่ แทนที่จะสร้าง property ใหม่
ค่าใหม่ทับค่าเดิม — property มีอยู่แล้วจึงไม่สร้างใหม่
const settings = { theme: "light", volume: 50 };
// อัปเดตค่าเดิม — เปลี่ยน theme
settings.theme = "dark";
console.log(settings.theme); // "dark"
// อัปเดตด้วย bracket — เปลี่ยน volume
settings["volume"] = 80;
console.log(settings.volume); // 80
// อัปเดตได้ทุกชนิด — string → number ก็เปลี่ยนได้
settings.volume = "off";
console.log(settings.volume); // "off"- **เพิ่ม vs อัปเดต:** ใช้ syntax `obj.key = value` เหมือนกัน — JavaScript ตัดสินใจเองว่า key มีอยู่แล้ว (อัปเดต) หรือยังไม่มี (เพิ่ม)
- **อัปเดตเปลี่ยนชนิดข้อมูลได้:** `string` → `number`, `number` → `boolean` — ไม่มีข้อจำกัดเรื่องชนิด
- **Bracket อัปเดตได้เหมือน dot:** `obj["key"] = value` — มีประโยชน์เมื่อ key มาจากตัวแปร
- **ค่าที่ถูกเขียนทับหายไปถาวร:** ไม่มี undo — ต้องตรวจสอบก่อนอัปเดตถ้าค่าเดิมสำคัญ
อัปเดตตามเงื่อนไข — ใช้ `if...else` และค่าจากตัวแปรภายนอก
ใช้ `if` ร่วมกับ assign — อัปเดตเฉพาะเมื่อเงื่อนไขเป็นจริง
const game = { name: "Zelda", score: 85, difficulty: "normal" };
// อัปเดต property เมื่อตรงเงื่อนไข
if (game.score > 80) {
game.difficulty = "hard";
}
console.log(game.difficulty); // "hard"`if...else` ใช้เลือกว่าจะอัปเดต property เป็นค่าไหน — แต่ละ path assign คนละค่า
const account = { level: "basic", price: 0 };
if (account.level === "premium") {
account.price = 999;
} else {
account.price = 299;
}
console.log(account.price); // 299ค่าที่อัปเดตไม่จำเป็นต้องเป็น literal — ใช้ค่าจากตัวแปรอื่นได้เช่นกัน
const user = { name: "สมชาย", email: "somchai@mail.com" };
const newName = "สมศักดิ์";
const newEmail = "somsak@mail.com";
// นำค่าจากตัวแปรมาอัปเดต
user.name = newName;
user.email = newEmail;
console.log(user.name); // "สมศักดิ์"
console.log(user.email); // "somsak@mail.com"**ใช้ `in` เช็กก่อนอัปเดต** — เมื่อ key อาจจะมีหรือไม่มีใน object (เช่น ข้อมูลที่มาจาก API) ควรใช้ `in` ตรวจสอบก่อนว่า key มีอยู่จริง แล้วค่อยอัปเดต `if ("key" in obj) { obj.key = newValue; }` — ปลอดภัยกว่าอัปเดตทันที โดยเฉพาะตอนที่ชื่อ property มาจากตัวแปร
อัปเดตด้วย computed value และอัปเดตหลาย property พร้อมกัน
ทางขวาของ `=` ใช้ expression ได้เต็มที่ — รวมถึงใช้ค่าจาก property อื่นใน object เดียวกัน
const cart = { price: 500, quantity: 2, discount: 0 };
// อัปเดตด้วย expression — คำนวณจากค่าเดิม
cart.price = cart.price * 1.07; // 535 (บวก vat 7%)
cart.quantity = cart.quantity + 1; // 3 (เพิ่มจำนวน)
cart.discount = cart.price > 1000 ? 50 : 10;
console.log(cart.price); // 535
console.log(cart.quantity); // 3
console.log(cart.discount); // 10อัปเดตหลาย property ใน object เดียว — เขียน assign ต่อเนื่องกันได้เลย
const profile = { name: "สมศรี", age: 25, city: "เชียงใหม่" };
// อัปเดตทีละ property
profile.age = 26;
profile.city = "กรุงเทพฯ";
profile.phone = "081-000-0000"; // key นี้เป็นของใหม่ → เพิ่ม ไม่ใช่อัปเดต
console.log(profile);
// { name: "สมศรี", age: 26, city: "กรุงเทพฯ", phone: "081-000-0000" }- **Expression ทางขวาของ `=`:** ใช้คำนวณจากค่าเดิม ตัวแปรอื่น หรือ ternary ได้หมด
- **สาย assign:** อัปเดตหลาย property ได้ใน object เดียว — ไม่ต้องสร้าง object ใหม่
- **อัปเดต + เพิ่มใน object เดียว:** บาง key มีอยู่ (อัปเดต) บาง key ยังไม่มี (เพิ่ม) — JavaScript จัดการให้เอง
- **Bracket + expression:** `obj[prefix + "_score"] = 100` — ใช้ expression เป็น key ได้เช่นกัน
ข้อควรระวัง — `const` object เปลี่ยน property ได้
ประกาศ object ด้วย `const` แล้วยังเปลี่ยน property ข้างในได้ — เพราะ `const` ล็อกแค่ **ชื่อตัวแปร** ว่าให้ชี้ไปที่ object นี้เท่านั้น ไม่ได้ล็อก **เนื้อหาภายใน** ของ object จะเปลี่ยนตัวแปรให้ชี้ไป object อื่นต่างหากที่ห้าม
`const` ป้องกันการ reassign ตัวแปร — แต่ไม่ได้ freeze เนื้อหาของ object
const user = { name: "สมชาย" };
// ✅ เปลี่ยน property ภายใน — ได้
user.name = "สมหญิง";
user.age = 25;
console.log(user); // { name: "สมหญิง", age: 25 }
// ❌ เปลี่ยนให้ตัวแปรชี้ object ใหม่ — Error!
// user = { name: "ใหม่" }; // TypeError: Assignment to constant variableสรุป: object ที่ประกาศด้วย `const` ยังเพิ่มและอัปเดต property ได้ตามปกติ — `const` แค่การันตีว่าตัวแปรจะไม่เปลี่ยนไปชี้ object อื่น