JS: Variadic Functions

Elucian MoiseElucian Moise
6 min read

In JavaScript, a variadic function is a function that can accept an indefinite number of arguments. Variadic functions are useful when you want to define a function that can handle a varying number of arguments, such as a function that can sum up any number of values.

Rest parameter

In JavaScript, you can use the rest parameter syntax to declare a variadic function. The rest parameter syntax allows you to specify an array that will contain all of the remaining arguments passed to a function. Here's an example:

function sum(...numbers) {
  return numbers.reduce((accumulator, currentValue) => accumulator + currentValue);
}

console.log(sum(1, 2, 3, 4)); // Output: 10
console.log(sum(5, 10, 15)); // Output: 30

In the example above, the sum function accepts a rest parameter numbers. The rest parameter is denoted by ... before the parameter name. When the sum function is called with any number of arguments, they are all gathered together into an array named numbers. The reduce method is then used to iterate through this array and calculate the sum of all the passed-in numbers.

You can also use destructuring with the rest parameter to extract specific arguments from the remaining arguments array. Here's an example:

function logFirstAndLastNames(first, last, ...otherNames) {
  console.log(`First name: ${first}`);
  console.log(`Last name: ${last}`);
  console.log(`Other names: ${otherNames.join(', ')}`);
}

logFirstAndLastNames('Bob', 'Smith', 'John', 'Jane', 'Sam');
// Output: 
//   First name: Bob
//   Last name: Smith
//   Other names: John, Jane, Sam

In the example above, the logFirstAndLastNames function expects at least two arguments: first and last. The rest of the arguments are gathered into an array named otherNames using the rest parameter syntax. We then use the join method to join all the names in otherNames with a comma and display it in the output.

Function Overloading

JavaScript does not natively support function overloading, which typically refers to defining multiple functions with the same name but different parameter types or numbers. However, there are ways to achieve similar functionality in JavaScript.

Using control statements

One approach is to use conditional statements to check the arguments passed to the function and determine the appropriate behavior based on their type or number. Here's an example:

function myFunction(x) {
  if (typeof x === 'number') {
    // Do something with a number argument
  } else if (typeof x === 'string') {
    // Do something with a string argument
  } else {
    // Handle other cases
  }
}

In this example, we define a function myFunction that behaves differently depending on the type of argument passed to it. If the argument is a number, the function performs one action; if it's a string, the function performs a different action. If the argument has any other type, we can apply some default behavior or throw an error.

Another approach to function overloading in JavaScript is to define a single function with optional parameters. Here's an example:

function myFunction(x, y, z) {
  if (y === undefined && z === undefined) {
    // Do something with one argument
  } else if (z === undefined) {
    // Do something with two arguments
  } else {
    // Do something with three arguments
  }
}

In this example, we define a function myFunction with three parameters, but make the second and third parameters optional. We can then check inside the function which arguments were provided and behave accordingly. If only one argument is passed, we perform a certain action; if two arguments are passed, we perform a different action, and so on.

It's worth noting that using optional parameters can become unwieldy when dealing with more than a few arguments, and may lead to confusing or error-prone code. In general, it's a good practice to ensure that your functions have clear, consistent behavior and avoid relying too heavily on conditional statements or optional parameters.

Using Arguments

In JavaScript, we have access to the arguments object, which is an array-like object that contains all the arguments passed to a function. We can use this object to verify the number of parameters received by the function.

Here's an example:

function myFunction() {
  var numArgs = arguments.length;

  if (numArgs === 0) {
    console.log("No arguments received");
  } else if (numArgs === 1) {
    console.log("One argument received");
  } else {
    console.log(numArgs + " arguments received");
  }
}

In this example, we define a function myFunction that uses the arguments object to determine the number of arguments passed to it. We then use a series of if statements to check the number of arguments and log an appropriate message to the console.

This approach is particularly useful when we want to define a function that can accept a variable number of arguments, without relying on a fixed number of named parameters. However, it's worth noting that using the arguments object can sometimes be less clear and more error-prone than defining named parameters explicitly. In general, it's a good practice to ensure that your functions have consistent behavior and clear documentation, regardless of how they handle function arguments.


Multiple Results

In JavaScript, functions can return multiple results using an array or an object. Here’s an example using an array:

function myFunction() {
  return ["apple", "banana", "cherry"];
}

var [a, b, c] = myFunction(); // Capture all three results

console.log(a); // "apple"
console.log(b); // "banana"
console.log(c); // "cherry"

In this example, the myFunction function returns an array with three elements. We can use array destructuring to capture each individual result into its own variable.

If we’re not interested in some of the results, we can just ignore them by omitting a destructuring variable for that position:

function myFunction() {
  return ["apple", "banana", "cherry"];
}

var [a, , c] = myFunction(); // Ignore the second result

console.log(a); // "apple"
console.log(c); // "cherry"

In this example, we capture the first and third elements of the array, but we ignore the second one. We do this by including an empty variable between the first and third positions in the destructuring assignment.

Another way to ignore results is to use the underscore character (_) as the variable name for the positions you’re not interested in:

function myFunction() {
  return ["apple", "banana", "cherry"];
}

var [a, _ , c] = myFunction(); // Ignore the second result

console.log(a); // "apple"
console.log(c); // "cherry"

In this example, we ignored the second element of the array by using the underscore character as the variable name for that position in the destructuring assignment.

Keep in mind that the underscore character is not a special syntax in JavaScript; it’s just a convention that some developers use to indicate that a variable is not being used.


Disclaim: This article is generated with ChatGPT. It may contain errors. If you find one please comment below so I can fix it. Thank you for reading.

Learn and prosper 🖖

1
Subscribe to my newsletter

Read articles from Elucian Moise directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Elucian Moise
Elucian Moise

Software engineer instructor, software developer and community leader. Computer enthusiast and experienced programmer. Born in Romania, living in US.