Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Cách kiểm tra đối số (argument) có được truyền vào hàm JavaScript không

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áchPhâ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.