Mục Lục
Nhiều Lập trình viên JavaScript (JavaScript Developer) dùng React hay Vue hằng ngày nhưng vẫn lúng túng khi bị hỏi về chính ngôn ngữ. Bài viết gom các câu hỏi phỏng vấn JavaScript thuần, không framework, theo nhóm kiến thức: ép kiểu, phạm vi biến, this, prototype và bất đồng bộ. Mỗi câu kèm điều người hỏi muốn kiểm tra và ý trả lời chính.

Tổng quan nhanh
– Câu hỏi được chia theo năm nhóm kiến thức cốt lõi của ngôn ngữ.
– Ép kiểu và từ khóa this là hai chỗ người quen dùng framework hay hụt.
– Câu đoán output được chấm ở cách suy luận nhiều hơn ở đáp án cuối.
– Bảng ở phần 6 gồm bốn đoạn code đã chạy thử, kèm khái niệm bị kiểm tra.
Bốn ý trên được triển khai theo thứ tự, bắt đầu từ mục đích của vòng hỏi này.
1. Vì sao vòng hỏi JavaScript thuần vẫn quan trọng
Framework đổi theo vài năm, còn cơ chế ngôn ngữ ít đổi hơn. Bộ câu hỏi phỏng vấn JavaScript thuần giúp người tuyển biết bạn hiểu điều gì diễn ra bên dưới thư viện. Nếu cần ôn nền tảng trước, bài Ngôn Ngữ Lập Trình JavaScript Là Gì? Đặc Điểm, Ứng Dụng & Lộ Trình Học tóm tắt đặc điểm của ngôn ngữ, còn bài này chỉ xoáy vào phần lõi.
2. Câu hỏi về kiểu dữ liệu và ép kiểu
Đây là nhóm mở màn dễ lộ việc học vẹt. Bốn câu dưới đây đi từ kiểu dữ liệu đến cách so sánh. Khi đọc mô tả công việc trong mục việc làm CNTT – phần mềm, bạn sẽ thấy yêu cầu “nắm vững JavaScript core” thường xuất hiện.
Các kiểu dữ liệu trong JavaScript
Câu hỏi: “JavaScript có những kiểu dữ liệu nào?”. Người hỏi muốn kiểm tra bạn phân biệt được kiểu nguyên thủy với object. Ý trả lời: bảy kiểu nguyên thủy gồm string, number, bigint, boolean, undefined, symbol, null, cùng kiểu object bao gồm cả mảng và hàm. Giá trị nguyên thủy so sánh theo giá trị, object so sánh theo tham chiếu.
Phân biệt null và undefined
Câu hỏi: “null và undefined khác nhau thế nào?”. Người hỏi muốn thấy bạn hiểu nguồn gốc từng giá trị: undefined xuất hiện khi biến đã khai báo nhưng chưa gán hoặc thuộc tính không tồn tại, còn null do lập trình viên chủ động gán để báo “không có giá trị”. Điểm cộng là nêu null == undefined cho true nhưng === cho false.
So sánh == và ===
Câu hỏi: “Khác nhau giữa == và === là gì?”. Người hỏi muốn biết bạn hiểu == ép kiểu trước khi so sánh, còn === so cả kiểu lẫn giá trị.
Truthy, falsy và typeof
Bạn nên kể đủ các giá trị falsy: false, 0, -0, 0n, chuỗi rỗng, null, undefined và NaN. Câu bẫy hay gặp là typeof null trả về "object", một lỗi lịch sử được giữ lại vì tương thích ngược.
3. Câu hỏi về phạm vi biến, hoisting và TDZ
Nhóm này kiểm tra bạn hiểu vòng đời của biến chứ không chỉ cách khai báo. Câu mở đầu hay là “So sánh var, let và const“, và câu trả lời tốt nêu đủ ba trục: phạm vi hàm hay khối, có gán lại được không, và hành vi khi truy cập trước dòng khai báo.
Về hoisting, khai báo var được kéo lên đầu phạm vi và khởi tạo bằng undefined, nên console.log(y); var y = 1; in ra undefined. Với let và const, biến nằm trong vùng chết tạm thời (Temporal Dead Zone) tới dòng khai báo, truy cập sớm sẽ ném ReferenceError.
4. Câu hỏi về this, call/apply/bind và prototype
Đây là nhóm mà ứng viên dùng framework lâu ngày hay hụt. Quy tắc cần nhớ: this được xác định lúc gọi hàm, trừ arrow function lấy this từ phạm vi bao quanh.
Câu điển hình: “Gán const f = obj.say rồi gọi f(), điều gì xảy ra?”. Người hỏi muốn thấy bạn nhận ra phương thức đã mất ngữ cảnh; ở strict mode, this là undefined nên truy cập thuộc tính sẽ lỗi. Từ đó dẫn sang call và apply gọi hàm ngay với this chỉ định, còn bind trả về hàm mới đã gắn ngữ cảnh.
Câu prototype hay gặp là “Từ khóa class trong ES6 (ECMAScript 2015) khác gì hàm khởi tạo?”. Ý trả lời: class chủ yếu là cú pháp gọn trên nền prototype, và extends nối chuỗi prototype giữa hai lớp.
Lời khuyên cho người quen dùng framework
– Bạn hãy viết lại một component nhỏ bằng JavaScript thuần, không dùng thư viện.
– Bạn nên tự gõ lại hàm bind và hàm debounce đơn giản mà không tra tài liệu.
– Bạn hãy chạy thử từng ví dụ ép kiểu trong console thay vì chỉ đọc bảng quy tắc.
Ba bài tập này mất ít thời gian nhưng lấp đúng những lỗ hổng hay bị hỏi.
Nắm chắc ngữ cảnh và prototype, phần bất đồng bộ sẽ dễ hơn.
5. Câu hỏi về bất đồng bộ và Node.js
Nhóm này đi theo dòng tiến hóa callback, Promise rồi async/await. Người hỏi muốn biết bạn hiểu vì sao cần mỗi bước: callback lồng nhau khó bắt lỗi, Promise cho phép nối chuỗi, còn async/await giúp code đọc giống tuần tự. Câu đào sâu thường gặp:
– Bạn bắt lỗi của hàm async bằng try/catch thế nào, và khi nào lỗi vẫn lọt ra ngoài?
– Promise.all và Promise.allSettled khác nhau ra sao khi một yêu cầu bị từ chối?
– Vòng lặp sự kiện (event loop) phân biệt hàng đợi microtask và macrotask thế nào?
Ba câu trên kiểm tra khả năng dự đoán thứ tự chạy. Với Node.js, câu hay hỏi là JavaScript phía server khác trình duyệt ở đâu: không có DOM và window, có module như fs và http.

6. Câu hỏi phỏng vấn JavaScript dạng đoán output
Nhà tuyển dụng hay đưa đoạn code 5–10 dòng rồi hỏi kết quả in ra. Điều được chấm là quá trình đi đến đáp án, vì đoán đúng mà không giải thích được cũng chỉ ngang đoán may. Cách làm hiệu quả là “đọc to” từng dòng: biến đang mang giá trị gì, quy tắc nào áp dụng, rồi mới chốt kết quả.
| Đoạn code | Output | Khái niệm bị kiểm tra |
|---|---|---|
console.log([] == false) |
true |
Ép kiểu với ==: mảng rỗng thành chuỗi rỗng rồi thành 0, false cũng thành 0. |
console.log(1 + "2" - 1) |
11 |
Dấu + nối chuỗi thành “12”, dấu – ép về số. |
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i), 0) |
3 3 3 |
Phạm vi hàm của var và closure; đổi sang let sẽ in 0 1 2. |
setTimeout(() => console.log("A"), 0); Promise.resolve().then(() => console.log("B")); console.log("C") |
C B A |
Code đồng bộ chạy trước, microtask của Promise chạy trước setTimeout. |
Một câu trả lời sai nhưng có lập luận rõ ràng thường được đánh giá cao hơn một đáp án đúng không kèm lời giải thích.
Lưu ý khi làm câu đoán output
– Bạn đừng trả lời khi chưa đọc hết đoạn code, vì dòng cuối thường chứa bẫy.
– Bạn nên hỏi lại đoạn code chạy ở strict mode hay không khi câu hỏi có this.
– Bạn hãy viết thứ tự chạy ra giấy khi đoạn code trộn setTimeout với Promise.
Ba thói quen này giúp người phỏng vấn theo kịp mạch suy nghĩ của bạn.
Nếu còn thời gian, hãy đề xuất cách viết lại đoạn code cho dễ đọc.
7. Câu hỏi thường gặp
1. Phỏng vấn JavaScript có cần biết TypeScript không? Tùy vị trí; TypeScript thường là điểm cộng, còn phần lõi JavaScript vẫn được hỏi trước.
2. Thời gian gấp thì nên ôn nhóm nào trước? Ưu tiên ép kiểu, this và thứ tự chạy của Promise.
3. Có được thử code trong console khi phỏng vấn không? Tùy quy định từng buổi; hãy hỏi trước, nếu không được thì suy luận thành tiếng.
Vòng hỏi ngôn ngữ cho thấy bạn hiểu JavaScript đến đâu khi bỏ framework sang một bên. Khi luyện câu hỏi phỏng vấn JavaScript, hãy đi lần lượt qua ép kiểu, phạm vi biến, this, prototype và bất đồng bộ, rồi tự giải các đoạn code ngắn bằng cách nói thành tiếng từng bước. Hãy mở console ngay hôm nay, chạy lại bốn đoạn code trong bảng và tự giải thích kết quả trước khi đối chiếu.
Bài viết mang tính tham khảo; nội dung và hình thức phỏng vấn thực tế tùy từng doanh nghiệp, vị trí và cấp độ kinh nghiệm.
Minh An



