Câu Hỏi Phỏng Vấn Cơ Bản Về JavaScript
Giới Thiệu
JavaScript là một trong những ngôn ngữ lập trình phổ biến nhất hiện nay, được sử dụng rộng rãi để phát triển web. Khi chuẩn bị cho cuộc phỏng vấn, việc nắm vững các khái niệm cơ bản là rất quan trọng. Bài viết này sẽ cung cấp cho bạn những câu hỏi phỏng vấn cơ bản về JavaScript mà bạn có thể thực hành để nâng cao kỹ năng của mình.
Mục Lục
- Biến và Kiểu Dữ Liệu
- Toán Tử
- Hàm
- Phạm Vi và Hoisting
- Thách Thức Lập Trình
- Thực Tiễn Tốt Nhất và Cạm Bẫy Thường Gặp
Biến và Kiểu Dữ Liệu
1. Các kiểu dữ liệu khác nhau trong JavaScript là gì?
- JavaScript hỗ trợ các kiểu dữ liệu sau:
- Primitive Types: Number, String, Boolean, Null, Undefined, Symbol, BigInt.
- Reference Types: Objects, Arrays, Functions.
2. Sự khác biệt giữa var, let, và const là gì? (kèm ví dụ)
var: Có phạm vi toàn cục hoặc hàm, có thể được khai báo lại.let: Có phạm vi khối, không thể khai báo lại trong cùng một phạm vi.const: Có phạm vi khối, không thể khai báo lại và phải được khởi tạo ngay.
javascript
var a = 10;
let b = 20;
const c = 30;
3. Giá trị mặc định của một biến chưa được khởi tạo là gì?
- Giá trị mặc định là
undefined.
4. Sự khác biệt giữa kiểu dữ liệu nguyên thủy và kiểu tham chiếu trong JS là gì?
- Kiểu nguyên thủy lưu trữ giá trị thực tế, trong khi kiểu tham chiếu lưu trữ địa chỉ ô nhớ.
5. typeof null được đánh giá như thế nào và tại sao?
- Kết quả là
object, vì một lỗi trong việc thiết kế ngôn ngữ.
Toán Tử
1. Giải thích sự khác biệt giữa == và ===.
==so sánh giá trị, có thể chuyển đổi kiểu;===so sánh cả giá trị và kiểu.
2. Sự khác biệt giữa ++a và a++ là gì?
++a: Tăng giá trị trước khi sử dụng;a++: Sử dụng giá trị trước khi tăng.
3. Toán tử + hoạt động như thế nào với chuỗi và số?
- Nếu một trong các toán hạng là chuỗi, nó sẽ chuyển đổi số thành chuỗi và nối chúng lại.
4. Kết quả của NaN === NaN là gì và tại sao?
- Kết quả là
false, vìNaNkhông bằng chính nó.
5. Giải thích toán tử ?? (nullish coalescing) với ví dụ.
- Toán tử này trả về giá trị bên phải nếu giá trị bên trái là
nullhoặcundefined.
javascript
let a = null;
let b = a ?? 10; // b sẽ có giá trị là 10
Hàm
1. Sự khác biệt giữa khai báo hàm và biểu thức hàm là gì?
- Khai báo hàm: có thể được gọi trước khi khai báo; biểu thức hàm: không thể.
2. Hàm mũi tên là gì, và nó xử lý this như thế nào?
- Hàm mũi tên không có
thisriêng, nó kế thừathistừ ngữ cảnh bao ngoài.
3. Viết một hàm để đảo ngược một số.
javascript
function reverseNumber(num) {
return num.toString().split('').reverse().join('');
}
4. Giải thích tham số mặc định trong hàm với ví dụ.
- Tham số mặc định cho phép bạn định nghĩa giá trị mặc định cho tham số trong hàm.
javascript
function greet(name = 'Người dùng') {
return `Chào, ${name}`;
}
5. Viết một hàm để kiểm tra xem một số có phải là palindrome hay không.
javascript
function isPalindrome(num) {
let str = num.toString();
return str === str.split('').reverse().join('');
}
Phạm Vi và Hoisting
1. Phạm vi trong JavaScript là gì?
- Phạm vi xác định nơi mà biến có thể được truy cập.
2. Sự khác biệt giữa phạm vi toàn cục, phạm vi hàm, và phạm vi khối là gì?
- Phạm vi toàn cục: có thể truy cập từ bất kỳ nơi nào; phạm vi hàm: chỉ có thể truy cập trong hàm; phạm vi khối: chỉ có thể truy cập trong khối mã.
3. Hoisting là gì? Đưa ra ví dụ với biến và hàm.
- Hoisting là hành vi của JavaScript khi di chuyển khai báo biến và hàm lên đầu phạm vi.
4. Tại sao let và const có Temporal Dead Zone?
- Vì chúng không thể được truy cập trước khi được khai báo.
5. Giải thích closures và đưa ra một trường hợp sử dụng thực tế.
- Closures cho phép một hàm truy cập các biến từ ngữ cảnh bao ngoài ngay cả sau khi hàm đó đã hoàn thành.
Thách Thức Lập Trình
1. Viết hàm giai thừa sử dụng đệ quy.
javascript
function factorial(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
2. Tạo một hàm để tìm số lớn nhất trong một mảng.
javascript
function findMax(arr) {
return Math.max(...arr);
}
3. Viết hàm đếm nguyên âm trong một chuỗi.
javascript
function countVowels(str) {
return (str.match(/[aeiou]/gi) || []).length;
}
4. Triển khai chương trình hoán đổi hai số mà không sử dụng biến tạm.
javascript
function swap(a, b) {
a = a + b;
b = a - b;
a = a - b;
return [a, b];
}
5. Xây dựng một hàm máy tính đơn giản nhận hai số và một toán tử.
javascript
function calculator(a, b, operator) {
switch (operator) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
default: return 'Toán tử không hợp lệ';
}
}
Thực Tiễn Tốt Nhất và Cạm Bẫy Thường Gặp
Thực Tiễn Tốt Nhất
- Sử dụng
constvàletthay vìvar. - Viết hàm ngắn gọn và có mục đích rõ ràng.
- Luôn sử dụng
===để so sánh giá trị.
Cạm Bẫy Thường Gặp
- Quên khai báo biến với
lethoặcconstcó thể dẫn đến lỗi khó tìm. - Sử dụng toán tử
==có thể gây ra những so sánh không mong muốn.
Kết Luận
Việc nắm vững các khái niệm cơ bản về JavaScript không chỉ giúp bạn tự tin hơn trong phỏng vấn mà còn là nền tảng vững chắc cho sự nghiệp lập trình của bạn. Hãy thực hành với các câu hỏi và bài tập nêu trên để nâng cao kỹ năng lập trình JavaScript của bạn. Chúc bạn thành công!
Câu Hỏi Thường Gặp (FAQ)
1. Làm thế nào để tôi cải thiện kỹ năng JavaScript của mình?
- Bạn có thể tham gia các khóa học trực tuyến, đọc sách hoặc tham gia các dự án thực tế.
2. Có công cụ nào giúp tôi kiểm tra mã JavaScript không?
- Bạn có thể sử dụng các công cụ như ESLint để kiểm tra mã và tìm lỗi.
3. Tôi nên học những gì sau khi nắm vững JavaScript cơ bản?
- Hãy tìm hiểu về các framework như React, Angular hoặc Vue.js để nâng cao kỹ năng lập trình web của bạn.