0Pricing
JavaScript Academy · บทเรียน

รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม

อัปเดตข้อมูลด้วยการสร้างสำเนาใหม่

รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Object.freeze และ seal
  2. การทำให้ออบเจ็กต์หยุดนิ่งแบบตื้นเทียบกับแบบลึก
  3. รูปแบบการอัปเดตแบบไม่เปลี่ยนแปลงข้อมูลเดิม
  4. structuredClone สำหรับสำเนาเชิงลึก
← กลับไปที่ JavaScript Academy