F8

FULLSTACK HUB

JavaScript 1 tháng 7, 2026 lúc 01:41
Thuộc bài học:[Buổi 16] - Day 16: Array, String, Number trong JavaScript

VI. Hai quy tắc Destructuring (Phân rã) cần khắc cốt ghi tâm

Chào mừng bạn đến với cú pháp "quốc dân" của JavaScript hiện đại. Khi đã quen tay với Destructuring (Phân rã), bạn sẽ thấy code của mình ngắn đi một nửa, sạch sẽ và đậm chất chuyên nghiệp. Sau này lên ReactJS, nếu không vững phần này, bạn sẽ hoàn toàn bị "lác mắt" vì không hiểu tại sao người ta lại viết code lạ lùng như vậy.

Hãy nhớ nằm lòng đúng 2 quy tắc cốt lõi bằng hình ảnh trực quan dưới đây:

1. Quy tắc Mảng [] — "Xếp hàng điểm danh" (Thứ tự là tối thượng)

  • Bản chất: Đối với mảng, JS không quan tâm bạn đặt tên biến là gì. Nó chỉ quan tâm vị trí của biến đó đứng thứ mấy thì sẽ bốc phần tử có index tương ứng bỏ vào.
  • Hình ảnh: Giống như xếp hàng nhận ghế trên xe buýt. Biến đứng đầu nhận ghế số 1, biến đứng sau nhận ghế số 2.

const framework = ["React", "Vue", "Angular"];

// Phân rã mảng const [thangDauTien, thangThuHai] = framework;

console.log(thangDauTien); // "React" (Vì đứng vị trí số 0) console.log(thangThuHai); // "Vue" (Vì đứng vị trí số 1)

💡 Tuyệt chiêu nâng cao:

  • Bỏ qua phần tử: Muốn lấy thằng số 1 và thằng số 3, bỏ qua thằng số 2? Chỉ cần để trống khoảng cách giữa dấu phẩy:

const [prop1, , prop3] = ["WordPress", "Elementor", "Bricks Builder"];
console.log(prop3); // "Bricks Builder"

  • Gom phần tử còn lại (...): Lấy thằng đầu tiên, còn lại gom hết vào một mảng phụ:

const [leader, ...assistant] = ["Thiên", "Bắc", "Dũng", "Sơn"];
console.log(assistant); // ['Bắc', 'Dũng', 'Sơn']

2. Quy tắc Object {} — "Bắn la-ze gọi tên" (Tên Key là tối thượng)

  • Bản chất: Đối với Object, thứ tự đứng trước đứng sau hoàn toàn vô nghĩa. JS sẽ dùng tên của biến làm tia la-ze dò tìm xem trong Object có cái key nào trùng tên chính xác 100% hay không để bốc dữ liệu ra.

const targetSEO = { 
    traffic: 5000, 
    domain: "ledsun.vn", 
    platform: "WordPress" 
};

// Phân rã Object: Thứ tự viết thoải mái, miễn là đúng tên key const { platform, domain } = targetSEO;

console.log(domain); // "ledsun.vn" console.log(platform); // "WordPress"

💡 Tuyệt chiêu nâng cao (Cần "khắc cốt ghi tâm"):

  • Đổi tên biến để tránh trùng lặp: Nếu biến traffic đã bị trùng ở file code khác, bạn muốn bốc thuộc tính traffic ra nhưng đặt vào một cái tên biến mới là currentTraffic? Hãy dùng dấu hai chấm :

const { traffic: currentTraffic } = targetSEO;
console.log(currentTraffic); // 5000

  • Gán giá trị mặc định phòng hờ: Nếu Object lỡ như không có thuộc tính đó (dữ liệu lỗi từ server), bạn có thể gán sẵn một giá trị phòng thủ bằng dấu bằng =

const { ssl = true, errorCount = 0 } = targetSEO; 
// Vì targetSEO không có key errorCount, biến errorCount sẽ lấy giá trị mặc định là 0

3 Bài Tập Luyện Tay Tăng Tư Duy Logic

Hãy mở file test.js lên, nạp bộ dữ liệu thực tế này vào và giải quyết bằng Destructuring.

const clientProject = {
    brand: "Led Sun",
    techStack: ["WordPress", "Bricks Builder", "RankMath SEO"],
    seoMetrics: {
        backlinks: 450,
        keywordsCount: 120
    },
    status: "active"
};

Bài 1: Phân rã mảng (Trích xuất công nghệ)

Dựa vào thuộc tính techStack của Object trên:

  • Hãy dùng Destructuring Mảng để lấy ra phần tử đầu tiên đặt tên biến là cms, phần tử thứ ba đặt tên biến là seoPlugin. (Bỏ qua phần tử thứ hai ở giữa).

Bài 2: Phân rã Object nâng cao (Đổi tên và Phòng thủ)

Dựa vào Object clientProject gốc:

  • Hãy dùng Destructuring Object để bốc thuộc tính brand ra ngoài.

  • Đồng thời bốc thuộc tính status ra ngoài nhưng phải đổi tên biến thành projectStatus.

  • Đồng thời lấy ra một thuộc tính phòng hờ tên là budget (thuộc tính này hiện tại chưa có trong Object gốc) và gán cho nó giá trị mặc định là 5000000.

Bài 3: Trùm cuối — Phân rã ngay tại Tham số của Hàm (Cực hay dùng trong React)

Viết một function tên là hienThiBaoCao.

  • Yêu cầu: Hàm này nhận vào đúng 1 tham số là một Object. Bạn hãy áp dụng Destructuring Object ngay trên hàng khai báo tham số của hàm để lấy trực tiếp thuộc tính brand và Object con seoMetrics bên trong ra xài luôn, không cần viết code bốc tách ở trong thân hàm.

  • Thân hàm chỉ làm nhiệm vụ in ra dòng chữ: "Dự án [brand] có [seoMetrics.backlinks] backlinks."

// Gợi ý cấu trúc Bài 3:
function hienThiBaoCao({ /* Viết destructuring ở đây */ }) {
    // Code in ra kết quả...
}

hienThiBaoCao(clientProject); // Chạy thử hàm này

Lấy giấy bút nhẩm logic hoặc gõ code trực tiếp rồi quăng sản phẩm lên đây tôi chấm lỗi cú pháp cho nhé! Bắt đầu nào.

Bài Tập & Chấm Điểm
💻 Code của học viên

const clientProject = {
    brand: "Led Sun",
    techStack: ["WordPress", "Bricks Builder", "RankMath SEO"],
    seoMetrics: {
        backlinks: 450,
        keywordsCount: 120
    },
    status: "active"
};

const {techStack} = clientProject; const [cms, , seoPlugin] = techStack;

// Bài 2: Phân rã Object nâng cao (Đổi tên và Phòng thủ) // Dựa vào Object clientProject gốc: // Hãy dùng Destructuring Object để bốc thuộc tính brand ra ngoài. // Đồng thời bốc thuộc tính status ra ngoài nhưng phải đổi tên biến thành projectStatus. // Đồng thời lấy ra một thuộc tính phòng hờ tên là budget (thuộc tính này hiện tại chưa có trong Object gốc) và gán cho nó giá trị mặc định là 5000000.

const {brand, status: projectStatus, traffics = 5000000 } = clientProject;

console.log(brand, projectStatus, traffics);

//Bai 3 function hienThiBaoCao(obj) { const {brand, seoMetrics} = obj; return Dự án ${brand} có ${seoMetrics.backlinks} backlinks; }

console.log(hienThiBaoCao(clientProject));



Giảng viên góp ý

Chấm bài đây! Lần này mức độ phức tạp cao hơn nhưng bạn giải quyết cực kỳ gọn, cú pháp Destructuring đã ăn vào tay rồi đấy. Tuy nhiên vẫn có 2 chi tiết nhỏ cần "chỉnh thước ngắm" lại cho chuẩn xác 100%.

Bài 1: Phân rã mảng — 10/10 điểm

JavaScript
const {techStack} = clientProject;
const [cms, , seoPlugin] = techStack;
  • Nhận xét: Quá chuẩn. Bạn bốc cái mảng techStack ra trước, rồi từ cái mảng đó bạn dùng dấu phẩy trống , , để nhảy cóc qua phần tử ở giữa, lấy đúng cmsseoPlugin.

  • Mẹo viết ngắn gọn (Pro shortcut): Bạn hoàn toàn có thể lồng hai bước này lại làm một dòng duy nhất như thế này:

    JavaScript
    const [cms, , seoPlugin] = clientProject.techStack;
    

Bài 2: Phân rã Object nâng cao — 9/10 điểm (Lệch tên biến)

JavaScript
const {brand, status: projectStatus, traffics = 5000000 } = clientProject;
  • Nhận xét: Cú pháp đổi tên status: projectStatus và tạo giá trị phòng thủ = 5000000 bạn viết chính xác 100% về mặt kỹ thuật.

  • Điểm trừ nhỏ: Đề bài yêu cầu đặt tên thuộc tính phòng hờ là budget, nhưng bạn lại gõ nhầm thành traffics. Sửa lại chữ traffics thành budget là ăn điểm tuyệt đối luôn.

Bài 3: Destructuring tại tham số — 6/10 điểm (Sai yêu cầu cấu trúc)

Nhìn kỹ lại yêu cầu nhé: "Hãy áp dụng Destructuring Object ngay trên hàng khai báo tham số của hàm để lấy trực tiếp thuộc tính... không cần viết code bốc tách ở trong thân hàm."

Code của bạn vẫn đang nhận vào biến obj ở tham số, rồi mới vào thân hàm để phân rã:

JavaScript
// CÁCH BẠN VIẾT (Vẫn phải tốn 1 dòng trong thân hàm)
function hienThiBaoCao(obj) {
    const {brand, seoMetrics} = obj;
    // ...
}

Tại sao tôi lại ép bạn phải tập viết Destructuring ngay tại tham số? Because sau này khi bạn học lên ReactJS ở F8, tất cả các Component đều nhận dữ liệu dạng Props (một Object lớn). Viết destructuring ngay trên tham số là luật bất thành văn của dân làm React để code ngắn, sạch, nhìn phát biết ngay hàm này cần những nguyên liệu gì để chạy.

Cách sửa chuẩn React Style:

JavaScript
// Bốc vỏ Object ngay tại hàng tham số luôn!
function hienThiBaoCao({ brand, seoMetrics }) {
    // Trong này không cần const {brand...} nữa, xài trực tiếp luôn!
    return Dự án <span class="hljs-subst">${brand}</span> có <span class="hljs-subst">${seoMetrics.backlinks}</span> backlinks;
}

console.log(hienThiBaoCao(clientProject));

Bạn thấy sức mạnh của nó chưa? Biến obj biến mất hoàn toàn, dòng khai báo biến bên trong thân hàm cũng bay màu. Hàm bây giờ nhìn cực kỳ tinh gọn và chuyên nghiệp.

Chốt hạ chặng đường:

Đến thời điểm này, toàn bộ mớ kiến thức "sống còn" và "hố tử thần" của JavaScript cơ bản bao gồm: Tham chiếu/Tham trị, Cắt gọt mảng, Bộ ba Map/Filter/Reduce, Tìm kiếm, Xử lý chuỗi, và Destructuring bạn đều đã thực hành và hiểu tận gốc rễ. Bạn không hề học vẹt mà đã có tư duy phân tích bộ nhớ rất sâu sắc.

Giữ nguyên bộ khung tư duy cứng cáp này, mở F8 lên và quét sạch các bài tập thực hành tiếp theo đi thôi! Mọi bug bây giờ chỉ là chuyện nhỏ.



Thắc mắc này cực kỳ chí mạng! Người mới học lập trình khi nhìn vào khúc này đều sẽ bị "khựng" lại một nhịp vì cảm thấy nó phi logic. Tại sao không có dấu bằng (= clientProject) mà JS vẫn tự biết đường mò vào trong để bốc dữ liệu?

Bản chất của phép thuật này nằm ở cơ chế Gán ngầm (Implicit Assignment) khi gọi hàm. Hãy cùng bóc tách lớp mặt nạ của nó ra nhé.

1. Bản chất: Ai đã gán nó cho clientProject?

Khi bạn viết định nghĩa hàm:

JavaScript
function hienThiBaoCao({ brand, seoMetrics }) { ... }

Lúc này dấu { brand, seoMetrics } chỉ là một cái khuôn (hoặc cái phễu) chờ sẵn ở cửa. Nó chưa hề có dữ liệu gì cả.

Cú lừa nằm ở dòng này:

JavaScript
hienThiBaoCao(clientProject);

Ngay tại khoảnh khắc bạn truyền clientProject vào trong dấu ngoặc của lời gọi hàm, JavaScript ở dưới bo mạch sẽ thực hiện ngay lập tức một lệnh gán ngầm tương đương như sau:

JavaScript
// JS tự động chạy dòng này dưới bộ nhớ:
let { brand, seoMetrics } = clientProject;

Nghĩa là, thay vì bạn phải tự tay viết dấu bằng (= clientProject) trong thân hàm, thì hành động bỏ clientProject vào dấu ngoặc câu lệnh gọi hàm chính là lúc bạn đã thực hiện phép gán đó rồi!

2. Hãy nhìn lại 2 cách viết để thấy sự dịch chuyển của dấu bằng (=)

Để bạn dễ hình dung, hãy xem sự tiến hóa từ cách viết truyền thống sang cách viết hiện đại:

Cách cũ: "Mang nguyên cái thùng vào nhà rồi mới khui"

JavaScript
function hienThiBaoCao(obj) {
    // Bước này bạn phải gán ngầm: obj = clientProject
    // Rồi bạn mới viết dấu bằng để bốc tách:
    const { brand, seoMetrics } = obj; 

<span class="hljs-keyword">return</span> <span class="hljs-string">`Dự án <span class="hljs-subst">${brand}</span>`</span>;

}

Cách mới (Destructuring tham số): "Khui thùng ngay tại cửa"

JavaScript
function hienThiBaoCao({ brand, seoMetrics }) {
    // Dấu bằng (=) chính là hành động bạn truyền clientProject ở bên dưới!
    return Dự án <span class="hljs-subst">${brand}</span>;
}

hienThiBaoCao(clientProject); // <--- Dữ liệu được nạp vào khuôn ở đây

3. Hình ảnh trực quan để nhớ lâu: "Shipper giao hàng"

Hãy tưởng tượng clientProject là một gói hàng bưu điện chứa nhiều đồ bên trong (brand, techStack, seoMetrics...).

  • Cách viết cũ: Bạn nhận nguyên gói hàng (obj), mang vào phòng khách, lấy kéo cắt băng keo (const { brand } = obj) để lấy đồ ra xài.

  • Cách viết mới: Bạn thiết kế một cái hòm thư có sẵn 2 ngăn đúng kích cỡ tên là brandseoMetrics ở trước cửa nhà. Khi ông shipper clientProject tới, ông ấy tự động rải đồ vào đúng 2 ngăn đó. Bạn chỉ việc chui từ trong nhà ra bốc đúng món ở ngăn đó xài, không cần cầm kéo cắt thùng nữa.

Chính vì sự tiện lợi này mà khi lên React, bạn sẽ thấy người ta viết kiểu này 100% để code rành mạch, nhìn vào tham số của hàm là biết ngay hàm này cần bốc những dữ liệu gì từ Object truyền vào.