Tham số và đối số của hàm trong JavaScript

1. Tham số và đối số của hàm trong JavaScript

Tham số của hàm (Function Parameter) chính là tên được ta liệt kê ra trong phần định nghĩa hàm.

Ví dụ:

function tênhàm (thamsố1, thamsố2, thamsố3) {
     //code
}

Đối số của hàm (Function Arguments) là những giá trị thực được truyền vào khi gọi hàm. Hay nó chính là những giá trị mà hàm được nhận.

Chú ý: Js function không thực hiện bất kỳ kiểm tra nào đối với các giá trị tham số hay đối số.

2. Quy tắc của tham số trong JavaScript

Một hàm trong Js có thể có nhiều hơn một tham số.

Hàm trong Js không xác định kiểu dữ liệu của tham số mà nó có thể là bất kỳ kiểu dữ liệu nào.

Hàm trong Js không thực hiện kiểm tra kiểu của các đối số truyền vào.

Hàm trong Js không kiểm tra số lượng đối số nhận được.

Ta có thể truyền ít hơn số đối số khi gọi một hàm. Khi đó:

  • Ít đối số hơn thì các tham số còn lại là undefined
  • Nhiều đối số hơn thì các đối số bổ sung sẽ bị bỏ qua

3. Tham số mặc định trong JavaScript – Default Parameter

Nếu một hàm được gọi mà không có đối số (ít hơn phần đã khai báo) thì những giá trị bỏ trống đó được đặt là undefined . Nhưng đôi khi điều này có thể chấp nhận được nhưng có lúc sẽ tốt hơn nếu ta gán cho tham số đó một giá trị mặc định cho tham số.

Ví dụ:

<script>
     function
myFunction(x, y) {
          if
(y === undefined) { 
               y = 2;
          }
          return
x * y
     }
    
document.write( myFunction(4));
<
/script>

Nếu một hàm được gọi với quá nhiều đối số (nhiều hơn phần khai báo) thì ta có thể lấy những đối số đó bằng cách sử dụng đối tượng arguments .

4. Đối tượng Arguments trong JavaScript

Mặc định, các hàm JavaScript có một đối tượng dựng sẵn (built-in object) được gọi là arguments object.

arguments object là một mảng giống như object. Bạn có thể truy cập các giá trị của nó bằng cách sử dụng chỉ mục tương tự như mảng. Tuy nhiên, nó không hỗ trợ các phương thức mảng.

Ví dụ: Arguments Object

function showMessage(parameter1, parameter2) {
     alert("Hello " + arguments[0] + " " + arguments[1] + "!");
}

showMessage("Minh", "Hoàng");           // Hello Minh Hoàng!
showMessage(100, 99.99);                // Hello 100 99.99!
showMessage(true, "2018/10/20");        // Hello true 2018/10/20!

arguments object vẫn hợp lệ ngay cả khi hàm không chứa bất kỳ tham số nào.

Ví dụ:

function showMessage() {
     alert("Hello " + arguments[0] + " " + arguments[1] + "!");
}

showMessage("Minh", "Hoàng", "Mr.");      // Hello Minh Hoàng!
showMessage(100);                         // Hello 100 undefined!

arguments object có thể được iterated bằng cách sử dụng vòng lặp for.

Ví dụ: Iterate all arguments

function showMessage() {
     var ii;
     var len = arguments.length;
     for(ii = 0; ii < len; ii++) {
          alert(arguments[ii]);
     }
}

showMessage("Minh", "Hoàng", "Blog");

Ví dụ: Tìm số lớn nhất của các đối số

function findMax() {
     var ii;
     var len = arguments.length;
     var max = -Infinity;
     for(ii = 0; ii < len; ii++) {
          if (arguments[ii] > max) {
               max = arguments[ii];
          }
     }
     return max;
}

findMax(1, 123, 200, 44, -88);  // return 200

Ví dụ: Tính tổng của các đối số

function sumAll() {
     var ii;
     var len = arguments.length;
     var sum = 0;
     for(ii = 0; ii < len; ii++) {
          sum += arguments[ii];
     }
     return sum;
}

sumAll(1, 123, 200, 44, -88);   // return 280

Nếu một hàm được gọi với quá nhiều đối số (nhiều hơn được khai báo), thì bạn có thể truy cập các đối số này bằng cách sử dụng arguments object.

5. Truyền giá trị cho đối số theo kiểu tham chiếu

Khi một đối số được truyền vào hàm theo kiểu tham trị thì lúc này hàm chỉ quan tâm giá trị của nó chứ không cần biết địa chỉ hay nơi lưu trữ. Giá trị đó sẽ được copy vào biến cục bộ (mới) của hàm. Do đó, dù cho bên trong hàm làm thay đổi giá trị của đối số thì giá trị ban đầu của tham số cũng không bị thay đổi. Tức là giá trị của đối số trước và sau khi ra khỏi hàm là giống nhau, không bị thay đổi.

Ví dụ:

function tangGiaTri(num) {
     num += 10;
     return num;
}

var num = 10tangGiaTri(num)   // Giá trị biến num không đổi sau gọi hàm

6. Đối tượng được truyền bằng tham chiếu

Trong Js, khi truyền một đối tượng vào hàm, đối tượng đó sẽ được xem như chúng được truyền bằng tham chiếu (pass by reference). Nếu hàm thay đổi một thuộc tính của đối tượng, thì thuộc tính đó sẽ thay đổi giá trị ban đầu.Tức là việc thay đổi của thuộc tính đối tượng bên trong hàm sẽ được phản ánh bên ngoài hàm.

function capNhat(obj) {
     obj.value = 20;
}
var obj = { value: 10 }; //Khởi tạo value = 10
changeValue(obj)         //Giá trị của value đã thay đổi sau gọi hàm