Trong JavaScript, tham số hàm là tùy chọn (optional) mặc định. Nếu không truyền, giá trị là undefined. Có 3 cách chính để kiểm tra:
Cách 1: Default Parameters (ES6+) - Khuyên dùng nhất
Gán giá trị mặc định ngay trong khai báo hàm. Code sạch, rõ ràng, không cần kiểm tra thủ công.
function greet(name = "Khách", greeting = "Chào") {
console.log(`${greeting} ${name}!`);
}
greet(); // "Chào Khách!"
greet("An"); // "Chào An!"
greet("Bình", "Hi"); // "Hi Bình!"
Cách 2: Kiểm tra arguments.length (Legacy / Cần phân biệt undefined truyền ý định)
Dùng khi cần biết người gọi có truyền đối số hay không, kể cả khi truyền undefined hoặc bỏ trống.
function foo(a, b) {
console.log("Số lượng đối số thực tế:", arguments.length);
// arguments.length = 0, 1, hoặc 2
if (arguments.length < 2) {
console.log("Thiếu đối số thứ 2");
}
}
foo(); // 0 - Thiếu đối số thứ 2
foo(1); // 1 - Thiếu đối số thứ 2
foo(1, 2); // 2 - Đủ
foo(1, undefined); // 2 - Đủ (đã truyền, dù giá trị undefined)
Cách 3: Kiểm tra undefined (Cũ, ít khuyên dùng)
function bar(x) {
if (x === undefined) {
console.log("x không được truyền HOẶC được truyền undefined");
} else {
console.log("x có giá trị:", x);
}
}
// Vấn đề: Không phân biệt được "không truyền" vs "truyền undefined"
bar(); // "x không được truyền..."
bar(undefined); // "x không được truyền..." (GIẢNG NHẬN)
So sánh
| Cách | Phân biệt "không truyền" vs "truyền undefined"? | Hỗ trợ default value? | Khuyên dùng? |
|---|---|---|---|
| Default Parameters (ES6+) | ❌ Không (undefined = không truyền) | ✅ Tự động | ✅ CHUẨN HIỆN ĐẠI |
arguments.length | ✅ Có | ❌ Thủ công | ⚠️ Cần phân biệt rõ ràng |
param === undefined | ❌ Không | ❌ Thủ công | ❌ Không (trừ legacy) |
| Destructuring + Default | ❌ Không | ✅ Tự động | ✅ Tốt cho object param |
Advanced: Destructuring với Default (Object Parameter)
function createUser({ name = "Anonymous", age = 18, role = "user" } = {}) {
// = {} cho phép gọi createUser() không đối số
console.log(name, age, role);
}
createUser(); // "Anonymous 18 user"
createUser({ name: "An" }); // "An 18 user"
createUser({ name: "Bình", age: 30, role: "admin" }); // "Bình 30 admin"
Ví dụ hoàn chỉnh (HTML)
<!DOCTYPE html>
<html>
<body>
<script>
function display(arg1 = 'Tutorials', arg2 = 'Learning') {
document.write(arg1 + ' ' + arg2 + "<br>");
}
display('Tutorials', 'Learning'); // Có đủ 2 đối số
display('Tutorials'); // Thiếu arg2 -> dùng default
display(); // Thiếu cả 2 -> dùng default
</script>
</body>
</html>
Tóm lại: Hãy dùng Default Parameters (ES6+) function(name = "default") cho 99% trường hợp. Chỉ dùng arguments.length khi bắt buộc phải phân biệt "không truyền" và "truyền undefined". Tránh kiểm tra === undefined đơn thuần.