ESLint's prefer-rest-params Rule: Writing Cleaner JavaScript


What is prefer-rest-params?

In ESLint, the prefer-rest-params rule enforces the use of rest parameters (...) over the legacy arguments object for handling variable-length argument lists in functions.

Why use rest parameters?

  • No Overwriting
    Unlike arguments, rest parameters cannot be accidentally overwritten within the function, preventing unexpected behavior.
  • Array-Like Behavior
    Rest parameters create a true array-like object, allowing you to use array methods like slice, map, and others on the captured arguments. This simplifies working with the arguments within the function.
  • Clarity and Consistency
    Rest parameters provide a more explicit and modern way to capture a variable number of arguments. They make the function signature clear, indicating that it can accept an indefinite number of arguments.

When does prefer-rest-params trigger?

function oldFunction(a, b) {
  console.log(arguments[0]); // Accesses the first argument (a) using arguments
}

How to fix the issue?

To adhere to the prefer-rest-params rule, rewrite the function using rest parameters:

function newFunction(a, ...rest) {
  console.log(rest[0]); // Accesses the first argument (a) using rest
}

Configuration options

The prefer-rest-params rule offers two configuration options:

  • "warn": Issues a warning for violations but doesn't prevent code execution.
  • "error" (default): Enforces the use of rest parameters and throws an error for violations.
  • If you're working with older code that relies on the arguments object, you might need to consider the trade-offs between maintaining compatibility and modernizing the codebase.
  • While prefer-rest-params generally promotes cleaner code, there are some edge cases where using arguments might be necessary. For instance, if you need to pass the original arguments object through to another function, rest parameters won't work here.


Before (using arguments)

// Function with a fixed number of arguments followed by variable arguments
function sum(a, b) {
  let total = a + b;
  // Access and potentially modify variable arguments using arguments
  for (let i = 2; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

// Function accessing arguments[0] (the first argument)
function greet(person) {
  console.log("Hello, " + arguments[0]);
}
// Function with a fixed number of arguments followed by variable arguments
function sum(a, b, ...rest) {
  let total = a + b;
  // Access and process variable arguments using rest as an array
  for (const num of rest) {
    total += num;
  }
  return total;
}

// Function accessing the first argument
function greet(person, ...otherInfo) { // Can capture additional optional information
  console.log("Hello, " + person);
  // otherInfo can be used if needed
}
  • In the greet function, we've added ...otherInfo to capture any optional information passed beyond person. This allows for flexibility in how the function is called.
  • In the sum function, we've replaced arguments with ...rest. Now, rest is a true array containing all the additional arguments passed to the function. We can iterate through it using a for...of loop or array methods like map or filter.


  1. Addressing specific limitations

    In rare cases, there might be edge scenarios where arguments is unavoidable. For example, if a function needs to pass the original arguments object through to another function, rest parameters won't work as they create a new array. In such situations, you might need to carefully weigh the benefits of prefer-rest-params against maintaining compatibility or refactoring the code.

  2. Modernizing your codebase

    If you're working with older code that relies heavily on the arguments object, consider the long-term benefits of modernizing the codebase. By adopting rest parameters and other modern features, you'll enhance readability, maintainability, and potential performance gains.

Here are some additional points to consider:

  • ESLint Configuration
    If you have other ESLint rules enforcing stricter coding standards, using arguments might lead to conflicts. Rest parameters often provide a more predictable and manageable way to handle variable-length argument lists.
  • Community Preference
    Rest parameters are generally the preferred approach in modern JavaScript development. Using them aligns with current best practices and promotes code that's easier for others to understand and maintain.