Объект arguments

Устаревший способ получить все значения, переданные в функцию при вызове.

Время чтения: меньше 5 мин

Кратко

Скопировано

Устаревший способ получить все значения, переданные в функцию при вызове в виде массивоподобного объекта. Используется в функциях, которые принимают произвольное количество аргументов.

Не работает в стрелочных функциях.

Пример

Скопировано

Функция, которая принимает произвольное количество аргументов, выбирает из них только строки и склеивает с помощью пробела:

        
          
          function joinStrings() {  const strings = []  for (let i = 0; i < arguments.length; i++) {    if (typeof arguments[i] === 'string') {      strings.push(arguments[i])    }  }  return strings.join(' ')}const result = joinStrings('hello', 12, 'world', false, null)console.log(result)// hello world
          function joinStrings() {
  const strings = []
  for (let i = 0; i < arguments.length; i++) {
    if (typeof arguments[i] === 'string') {
      strings.push(arguments[i])
    }
  }
  return strings.join(' ')
}

const result = joinStrings('hello', 12, 'world', false, null)
console.log(result)
// hello world

        
        
          
        
      

Как понять

Скопировано

arguments доступно во всех видах функций, за исключением стрелочных.

arguments — массивоподобный объект, к его элементам можно обращаться по индексу, у него есть свойство length, но arguments не имеет остальных методов массива, таких как push() или filter().

Массивоподобность объекта позволяет обойти его элементы с помощью цикла.

На практике

Скопировано

Андрей Паскаль советует

Скопировано

🛠 Иногда нужно создать функцию-обработчик для существующего события. Но при этом вам могут быть нужны не все лидирующие параметры. Например, из трёх параметров вам нужны только второй и третий. Что бы не получать назойливые предупреждения от линтера о неиспользованном первом параметре, можно использовать синтаксис остаточных параметров плюс деструктурирование массива:

        
          
          function myHandler(...[, second, third]) {  console.log(`Второй параметр = ${second}`)  console.log(`Третий параметр = ${third}`)}myHandler(1, 2, 3)// Второй параметр = 2// Третий параметр = 3
          function myHandler(...[, second, third]) {
  console.log(`Второй параметр = ${second}`)
  console.log(`Третий параметр = ${third}`)
}

myHandler(1, 2, 3)

// Второй параметр = 2
// Третий параметр = 3

        
        
          
        
      

Николай Лопин советует

Скопировано

🛠️ В новом коде лучше применять синтаксис остаточных параметров. В этом случае у нас появляется настоящий массив переданных аргументов. Вот как будет выглядеть пример из начала статьи в этом синтаксисе:

        
          
          function joinStrings(...rest) {  return rest    .filter(function (value) {      return typeof value === 'string'    })    .join(' ')}const result = joinStrings('hello', 12, 'world', false, null)console.log(result)// hello world
          function joinStrings(...rest) {
  return rest
    .filter(function (value) {
      return typeof value === 'string'
    })
    .join(' ')
}

const result = joinStrings('hello', 12, 'world', false, null)
console.log(result)
// hello world