รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม
อัปเดตข้อมูลด้วยการสร้างสำเนาใหม่
รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
อัปเดตโดยไม่เปลี่ยนแปลงข้อมูลเดิม
การอัปเดตแบบไม่เปลี่ยนแปลง จะสร้างสำเนาใหม่พร้อมใช้การเปลี่ยนแปลงกับสำเนานั้น โดยไม่แตะต้องข้อมูลเดิม นี่คือหัวใจของการจัดการสถานะที่คาดเดาได้ใน JavaScript สมัยใหม่
ตัวดำเนินการกระจาย ... เป็นเครื่องมือหลัก
คัดลอกออบเจ็กต์ด้วยการกระจาย
กระจายพร็อพเพอร์ตีของออบเจ็กต์ลงในออบเจ็กต์ใหม่ แล้วแทนค่าพร็อพเพอร์ตีที่ต้องการ ข้อมูลเดิมจะยังคงมีค่าเดิม
const user = { name: 'Ada', age: 36 };
const older = { ...user, age: 37 };
console.log(user.age);
console.log(older.age);ออบเจ็กต์เหล่านี้แตกต่างกัน
สำเนาเป็นออบเจ็กต์ใหม่เอี่ยม ไม่ใช่การอ้างอิงเดียวกัน การเปรียบเทียบเอกลักษณ์จะยืนยันเรื่องนี้
const original = { x: 1 };
const copy = { ...original };
console.log(original === copy);
console.log(original.x === copy.x);เพิ่มพร็อพเพอร์ตีโดยไม่เปลี่ยนแปลงข้อมูลเดิม
หากต้องการเพิ่มฟิลด์ ให้กระจายออบเจ็กต์เดิมแล้วใส่ key ใหม่ ออบเจ็กต์เดิมจะไม่ถูกเพิ่มสิ่งใด
const point = { x: 1, y: 2 };
const point3d = { ...point, z: 3 };
console.log(point);
console.log(point3d);ลบพร็อพเพอร์ตีโดยไม่เปลี่ยนแปลงข้อมูลเดิม
ใช้การแยกโครงสร้างเพื่อดึง key ที่ไม่ต้องการออกมาและเก็บส่วนที่เหลือ ออบเจ็กต์ส่วนที่เหลือจะไม่มี key นั้น
const user = { id: 1, name: 'Ada', secret: 'x' };
const { secret, ...safe } = user;
console.log(safe);
console.log(user.secret);คัดลอกอาร์เรย์ด้วยการกระจาย
กระจายอาร์เรย์ลงในอาร์เรย์ใหม่เพื่อคัดลอก เมธอดอย่าง map และ filter ก็คืนค่าอาร์เรย์ใหม่เช่นกัน โดยไม่เปลี่ยนแปลงแหล่งข้อมูล
const nums = [1, 2, 3];
const copy = [...nums];
const doubled = nums.map(n => n * 2);
console.log(nums);
console.log(doubled);เพิ่มสมาชิกในอาร์เรย์โดยไม่เปลี่ยนแปลงข้อมูลเดิม
แทนที่จะใช้ push ซึ่งเปลี่ยนแปลงข้อมูลเดิม ให้สร้างอาร์เรย์ใหม่ด้วยการกระจาย ความยาวของอาร์เรย์เดิมจะยังคงเท่าเดิม
const list = ['a', 'b'];
const added = [...list, 'c'];
const prepended = ['z', ...list];
console.log(list);
console.log(added);
console.log(prepended);ลบสมาชิกจากอาร์เรย์โดยไม่เปลี่ยนแปลงข้อมูลเดิม
ใช้ filter เพื่อสร้างอาร์เรย์ใหม่ที่ไม่มีรายการที่ไม่ต้องการ โดยปล่อยให้อาร์เรย์เดิมไม่เปลี่ยนแปลง
const nums = [1, 2, 3, 4];
const withoutThree = nums.filter(n => n !== 3);
console.log(nums);
console.log(withoutThree);อัปเดตออบเจ็กต์ที่ซ้อนอยู่
การอัปเดตข้อมูลที่ซ้อนอยู่ต้องกระจายออบเจ็กต์ในทุกระดับที่เปลี่ยนแปลงขึ้นมาใหม่ เฉพาะกิ่งข้อมูลที่แก้ไขเท่านั้นที่ถูกสร้างใหม่ ส่วนที่เหลือใช้อ้างอิงร่วมกัน
const state = { user: { name: 'Ada', age: 36 }, theme: 'dark' };
const updated = {
...state,
user: { ...state.user, age: 37 }
};
console.log(state.user.age);
console.log(updated.user.age);
console.log(state.theme === updated.theme);อัปเดตรายการในอาร์เรย์
ใช้ map เพื่อคืนค่าสำเนาที่เปลี่ยนแปลงแล้วสำหรับรายการที่ตรงเงื่อนไข และคืนค่ารายการเดิมสำหรับส่วนที่เหลือ ไม่มีสมาชิกใดถูกเปลี่ยนแปลงโดยตรง
const todos = [
{ id: 1, done: false },
{ id: 2, done: false }
];
const updated = todos.map(t =>
t.id === 2 ? { ...t, done: true } : t
);
console.log(todos[1].done);
console.log(updated[1].done);เหตุใดการอัปเดตแบบไม่เปลี่ยนแปลงจึงสำคัญ
การไม่เปลี่ยนแปลงสถานะที่ใช้ร่วมกันช่วยให้ตรวจจับการเปลี่ยนแปลงได้อย่างประหยัดด้วยการเปรียบเทียบการอ้างอิง ช่วยให้เลิกทำและทำซ้ำได้ และป้องกันข้อผิดพลาดจากการเปลี่ยนแปลงที่เกิดไกลจากจุดที่คาดไว้ รูปแบบคือ คัดลอก แล้วเปลี่ยนแปลงสำเนา บทถัดไปจะกล่าวถึงการคัดลอกแบบลึกด้วย structuredClone
function setName(state, name) {
return { ...state, name };
}
const s1 = { name: 'old', count: 0 };
const s2 = setName(s1, 'new');
console.log(s1.name, s2.name);ตรวจสอบความเข้าใจอย่างรวดเร็ว
{ ...user, age: 37 } ให้ผลลัพธ์เป็นอะไรเมื่อ user มี age อยู่แล้ว
ทบทวน: รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลง
คุณได้เรียนรู้วิธีอัปเดตโดยไม่เปลี่ยนแปลงข้อมูลเดิมแล้ว
- ใช้การกระจาย
{ ...obj, key: value }เพื่อคัดลอกและแทนค่า - ใช้การแยกโครงสร้างเพื่อเก็บส่วนที่เหลือ แล้วลบพร็อพเพอร์ตีโดยไม่เปลี่ยนแปลงข้อมูลเดิม
- ใช้
map,filterและการกระจายอาร์เรย์แทนpush/splice - กระจายในทุกระดับสำหรับการอัปเดตข้อมูลที่ซ้อนอยู่ และใช้อ้างอิงร่วมกันสำหรับส่วนที่เหลือ
คำถามที่พบบ่อย
บทเรียน “รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม”
อัปเดตข้อมูลด้วยการสร้างสำเนาใหม่ คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม
ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Object.freeze และ seal
- การทำให้ออบเจ็กต์หยุดนิ่งแบบตื้นเทียบกับแบบลึก
- รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม
- structuredClone สำหรับสำเนาเชิงลึก