Quay lại
Frontend
7 phút đọc27 tháng 3, 20264

30 khái niệm Frontend mà bạn phải nắm trước khi đi phỏng vấn

Frameworks thay đổi, tools tiến hóa, nhưng 30 concepts này cứ xuất hiện hoài trong mọi buổi phỏng vấn frontend. Nắm chắc chúng, bạn sẽ khác biệt.

N

Nguyen Nhat Long

@longnn

Bản đồ tổng quan 5 nhóm kiến thức frontend: ở trung tâm là biểu tượng Frontend Developer, xung quanh là 5 nhóm xếp thành vòng tròn gồm JS Core (màu vàng), Advanced Techniques (màu xanh dương), Async JS (màu tím), Browser Internals (màu cam), và Web Platform (màu xanh lá), mỗi nhóm có 5-6 keywords bên trong, phong cách mind map hiện đại

Mình từng rớt một buổi phỏng vấn frontend chỉ vì không giải thích được event loop cho rõ ràng. Không phải mình không biết — mình dùng setTimeout, Promise hàng ngày. Nhưng khi người ta hỏi "giải thích cơ chế hoạt động", mình ấp úng. Đó là lúc mình nhận ra: biết dùng khác xa với hiểu sâu.

Sau 5 năm làm frontend, ngồi cả hai phía bàn phỏng vấn, mình thấy một pattern rất rõ: framework thì năm nào cũng đổi — từ Angular sang React rồi giờ nhiều người nhảy sang Svelte, Solid. Nhưng những câu hỏi nền tảng? Chúng không bao giờ thay đổi. Người ta vẫn hỏi closure, vẫn hỏi prototypal inheritance, vẫn hỏi critical rendering path.

Dưới đây là 30 khái niệm mà theo kinh nghiệm của mình, bạn cần nắm chắc trước khi bước vào bất kỳ buổi phỏng vấn frontend nào. Mình chia thành 5 nhóm để dễ tiêu hóa.

JavaScript Core — Nền móng của mọi thứ

Đây là nhóm quan trọng nhất. Bạn có thể không nhớ API của React, nhưng nếu không hiểu JavaScript ở tầng sâu thì mọi thứ bạn xây đều lung lay.

1. Event loop và call stack — Hiểu cách JavaScript thực thi code, tại sao nó single-threaded mà vẫn handle được async.

2. Microtasks vs macrotasksPromise.then() chạy trước hay setTimeout(..., 0) chạy trước? Tại sao? Đây là câu hỏi kinh điển.

3. Closures và lexical scoping — Closure không phải khái niệm trừu tượng. Bạn dùng nó mỗi ngày khi viết React hooks, khi viết debounce function.

4. Hoisting và temporal dead zonevar vs let vs const không chỉ là chuyện convention. Hiểu hoisting giúp bạn debug những lỗi kỳ quặc.

5. Keyword this — Arrow function vs regular function xử lý this khác nhau hoàn toàn. Điều mình thấy hay là rất nhiều người dùng arrow function "vì tiện" mà không hiểu tại sao nó fix được vấn đề this.

6. Object references vs primitive comparisons — Tại sao {} === {} trả về false? Nếu bạn không trả lời được câu này, bạn sẽ gặp bug với React re-render mà không biết tại sao.

7. Prototypal inheritance — JavaScript không có class thật sự. class chỉ là syntactic sugar. Hiểu prototype chain giúp bạn hiểu cách JavaScript thực sự hoạt động.

8. Shallow vs deep copyObject.assign(), spread operator, structuredClone() — mỗi cái copy khác nhau. Sai ở đây là bug production đấy.

Minh họa event loop trong JavaScript: một vòng tròn trung tâm ghi "Event Loop" với các mũi tên kết nối đến Call Stack (hình chồng các khối), Microtask Queue (hàng đợi màu xanh chứa Promise), Macrotask Queue (hàng đợi màu cam chứa setTimeout), và Web APIs, nền tối, phong cách flat design hiện đại
Minh họa event loop trong JavaScript: một vòng tròn trung tâm ghi "Event Loop" với các mũi tên kết nối đến Call Stack (hình chồng các khối), Microtask Queue (hàng đợi màu xanh chứa Promise), Macrotask Queue (hàng đợi màu cam chứa setTimeout), và Web APIs, nền tối, phong cách flat design hiện đại

Kỹ thuật xử lý nâng cao

Nhóm này là nơi phân biệt junior và mid-level. Bạn có thể code được mà không cần hiểu sâu, nhưng khi phỏng vấn, đây là chỗ người ta đào.

9. Debounce vs throttle — Search input dùng cái nào? Scroll event dùng cái nào? Theo kinh nghiệm của mình, rất nhiều ứng viên nhầm lẫn hai khái niệm này.

10. Implicit vs explicit type coercion"5" + 3 vs "5" - 3 cho kết quả khác nhau. JavaScript "helpful" quá mức đôi khi là ác mộng.

11. Truthy/falsy values và equality quirks0, "", null, undefined, NaN — tất cả đều falsy nhưng không giống nhau.

12. == vs === — Nghe đơn giản nhưng bạn có giải thích được cơ chế type coercion đằng sau == không?

13. call, apply, bind — Ba cách thay đổi context của this. Cái nào gọi ngay, cái nào trả về function mới?

14. Event delegation và bubbling — Thay vì gắn listener cho 1000 items, gắn một cái cho parent. Đây là pattern mà React cũng dùng internally.

15. typeof, instanceof, type checkingtypeof null === 'object' là một trong những quirks nổi tiếng nhất của JavaScript.

16. Spread vs rest operators — Cùng cú pháp ... nhưng ngữ cảnh khác nhau hoàn toàn.

17. map, filter, reduce — Quan trọng hơn là biết khi nào KHÔNG nên dùng. Đừng chain 5 cái .map().filter().reduce() khi một vòng for đơn giản hiệu quả hơn.

18. Currying và partial application — Không phải chỉ để "khoe" functional programming. Currying thực sự hữu ích khi bạn cần tạo factory functions.

Async JavaScript — Nơi nhiều người vấp nhất

Theo kinh nghiệm phỏng vấn của mình, async là chủ đề mà ứng viên tự tin nhất nhưng lại sai nhiều nhất.

19. async/await vs Promises vs callbacks — Hiểu evolution: từ callback hell → Promise chain → async/await. Nhưng async/await cũng có pitfalls, ví dụ chạy tuần tự khi có thể chạy song song với Promise.all().

20. Error handling trong async JavaScripttry/catch với async/await, .catch() với Promise. Bạn có biết unhandled promise rejection có thể crash Node.js process không?

Sơ đồ so sánh 3 cách xử lý async trong JavaScript: bên trái là Callback Hell với các hàm lồng nhau tạo hình kim tự tháp, ở giữa là Promise Chain với các .then() nối tiếp nhau, bên phải là async/await với code phẳng dễ đọc, mỗi phần có highlight màu khác nhau, nền trắng, phong cách code editor
Sơ đồ so sánh 3 cách xử lý async trong JavaScript: bên trái là Callback Hell với các hàm lồng nhau tạo hình kim tự tháp, ở giữa là Promise Chain với các .then() nối tiếp nhau, bên phải là async/await với code phẳng dễ đọc, mỗi phần có highlight màu khác nhau, nền trắng, phong cách code editor

Browser — Hiểu nơi code của bạn chạy

Đây là nhóm mà nhiều frontend developer bỏ qua. Họ biết viết code nhưng không hiểu browser xử lý code đó như thế nào.

21. Critical rendering path — HTML → DOM, CSS → CSSOM, rồi merge thành Render Tree. Biết cái gì block rendering giúp bạn tối ưu performance đáng kể.

22. Repaint vs reflow — Thay đổi color chỉ gây repaint. Thay đổi width gây reflow — tốn kém hơn nhiều. Layout thrashing xảy ra khi bạn đọc rồi ghi DOM liên tục.

23. DNS resolution → TCP handshake → TLS → Request lifecycle — Khi user gõ URL và nhấn Enter, chuyện gì xảy ra? Câu hỏi kinh điển, và câu trả lời tốt thể hiện bạn hiểu toàn bộ hệ thống.

24. Cách browser render HTML, CSS, JS — Parser bị block bởi script tag như thế nào? defer vs async khác gì nhau?

Sơ đồ Critical Rendering Path của browser: luồng từ trái sang phải bắt đầu từ HTML Document đi qua HTML Parser thành DOM Tree, CSS Stylesheet đi qua CSS Parser thành CSSOM Tree, hai cây merge thành Render Tree, rồi qua Layout và cuối cùng là Paint, mỗi bước là một khối với icon minh họa, có mũi tên chỉ hướng, nền gradient tối
Sơ đồ Critical Rendering Path của browser: luồng từ trái sang phải bắt đầu từ HTML Document đi qua HTML Parser thành DOM Tree, CSS Stylesheet đi qua CSS Parser thành CSSOM Tree, hai cây merge thành Render Tree, rồi qua Layout và cuối cùng là Paint, mỗi bước là một khối với icon minh họa, có mũi tên chỉ hướng, nền gradient tối

Performance & Web Platform

Nhóm cuối cùng nhưng không kém phần quan trọng. Đây là những thứ cho thấy bạn không chỉ biết code mà còn biết ship sản phẩm tốt.

25. Preload, prefetch, lazy loading<link rel="preload"> vs <link rel="prefetch"> — một cái cho resource cần ngay, một cái cho resource có thể cần sau.

26. Service workers và caching strategies — Cache-first, network-first, stale-while-revalidate. Nếu bạn làm PWA, đây là kiến thức bắt buộc.

27. CORS, preflight requests, SameSite cookies — Mình đảm bảo bạn đã từng gặp lỗi CORS. Nhưng bạn có giải thích được tại sao browser gửi OPTIONS request trước không?

28. Web storage APIslocalStorage vs sessionStorage vs cookies. Khi nào dùng cái nào? Giới hạn dung lượng? Security implications?

29. Accessibility (a11y) — ARIA roles, focus management, semantic HTML. Điều mình thấy hay là nhiều công ty bắt đầu coi a11y là tiêu chí bắt buộc chứ không phải "nice to have" nữa.

30. Responsive design — Mobile-first approach, media queries, viewport units (vh, vw, dvh). Container queries giờ cũng đã được support rộng rãi.

Bản đồ tổng quan 5 nhóm kiến thức frontend: ở trung tâm là biểu tượng Frontend Developer, xung quanh là 5 nhóm xếp thành vòng tròn gồm JS Core (màu vàng), Advanced Techniques (màu xanh dương), Async JS (màu tím), Browser Internals (màu cam), và Web Platform (màu xanh lá), mỗi nhóm có 5-6 keywords bên trong, phong cách mind map hiện đại
Bản đồ tổng quan 5 nhóm kiến thức frontend: ở trung tâm là biểu tượng Frontend Developer, xung quanh là 5 nhóm xếp thành vòng tròn gồm JS Core (màu vàng), Advanced Techniques (màu xanh dương), Async JS (màu tím), Browser Internals (màu cam), và Web Platform (màu xanh lá), mỗi nhóm có 5-6 keywords bên trong, phong cách mind map hiện đại

Cách mình suggest bạn học

Đừng cố nhồi 30 khái niệm trong một tuần. Theo kinh nghiệm của mình, cách hiệu quả nhất là:

  • Nhóm 1-2 khái niệm mỗi ngày, đọc kỹ rồi viết lại bằng lời của mình. Nếu bạn không giải thích được cho người khác hiểu, bạn chưa thực sự hiểu.
  • Code ví dụ nhỏ cho mỗi concept. Đừng chỉ đọc lý thuyết. Mở console lên, thử typeof null, thử tạo closure, thử so sánh shallow copy vs deep copy.
  • Giả lập phỏng vấn với bạn bè hoặc tự record. Nghe lại sẽ thấy chỗ nào mình còn ấp úng.

Mình muốn nhấn mạnh một điều: 30 concepts này không phải để bạn học thuộc lòng rồi "trả bài". Chúng là nền tảng giúp bạn debug nhanh hơn, thiết kế solution tốt hơn, và giao tiếp với team hiệu quả hơn. Phỏng vấn chỉ là cái cớ để bạn hệ thống lại kiến thức.

Và cuối cùng — framework sẽ tiếp tục thay đổi. Có thể 3 năm nữa chúng ta không còn dùng React. Nhưng event loop vẫn là event loop. Closure vẫn là closure. Đầu tư vào nền tảng là khoản đầu tư không bao giờ mất giá.

Chúc bạn phỏng vấn thành công. 💪

NN

Nguyen Nhat Long

@longnn

Thấy hay? Chia sẻ cho bạn bè!

Bài viết liên quan

Có thể bạn cũng thích

Xem tất cả