freeCodeCamp/guide/russian/javascript/arguments/index.md

7.0 KiB
Raw Blame History

title localeTitle
Arguments аргументы

Объект arguments - это объект, подобный массиву (в том, что структура объекта аналогична структуре массива, однако он не должен рассматриваться как массив, поскольку он обладает всеми функциональными возможностями объекта) , вкотором хранятся все аргументы, которые вы передается функции и, в частности, принадлежит этой функции. Если вы должны были передать 3 аргумента функции, скажем, storeNames() , эти 3 аргумента будут храниться внутри объекта с аргументами, и это будет выглядеть так, когда мы передадим аргументы storeNames("Mulder", "Scully", "Alex Krycek") к нашей функции:

  • Сначала мы объявляем функцию и возвращаем объект arguments.
function storeNames () {return arguments; }

Затем, когда мы выполним функцию с n количеством аргументов, в нашем случае 3 аргумента, нам вернтся объект, который будет выглядеть как массив. Мы можем превратить его в массив, но об этом позже...

// Если мы выполним следующую строку в консоли: 
storeNames ('Малдер', 'Скалли', 'Алекс Крайчек'); 
// Вывод будет {'0': 'Малдер', '1': 'Скалли', '2': 'Alex Kryceck'}

Если вы хотите узнать больше, например, о превращении в массив или о проблеме оптимизации при использовании метода slice(_) и о том, как её решить, кликайте read more (Только для Gitter Chat). If you want to know more about this, such as converting it to an array or the optimization problem that comes with using the slice() method and how to solve it, click on read more (Gitter Chat Only).

Относитесь к arguments, как к массиву

Вы можете вызвать arguments с помощью arguments[n] (где n это индекс аргумента в объекте подобном массиву), но если вы хотите использовать его, как массив для применения циклов или методов массивов к нему, нужно превратить его в массив объявив переменную и используя метод Array.prototype.slice.call (потому, что arguments это не массив):

var args = Array.prototype.slice.call(arguments);

// или способ es6: 
var args = Array.from(arguments)

Поскольку slice() имеет (параметр end необязательный) два параметра, вы можете захватить определенную часть arguments уточнив (при сипользовании метода slice.call() оба этих параметра необязательны, не только end) начало и окончание нужной части; обратите внимание на следующий код:

function getGrades() {
  var args = Array.prototype.slice.call(arguments, 1, 3);
  return args;
}

// Теперь выведем это!
console.log(getGrades(90, 100, 75, 40, 89, 95));

// ВЫВОД ДОЛЖЕН БЫТЬ ТАКИМ: //
// [100, 75] <- Почему? Потому, что он начинался с индекса 1 и останавливался при индексе 3
// поэтому индекс 3 (40) не был учтен.
//
// Если мы удалим параметр «3», оставив только (arguments, 1), мы получим 
// каждый аргумент из индекса 1: \[100, 75, 40, 89, 95\].

Проблемы Оптимизации с Array.slice()

Есть маленькая проблема, не рекомендуется использовать slice в объекте arguments (по причинам оптимизации)...

Важно: Не следует использовать slice с arguments потому, что не сработает оптимозация в движках JavaScript (напр. V8). Вместо этого попробуйте создвть новый массив запустив цикл через объект arguments.

согласно Mozilla Developer Network (reference)

Итак, какие еще методы доступны для превращения arguments в массив? Я рекомендую цикл for (не for-in), можете сделать так:

var args = []; // Пустой массив, сперва.
for (var i = 0; i <arguments.length; i ++) { 
  args.push(arguments[i]) 
} // Теперь «args» - это массив, содержащий ваши аргументы. 

Для получения дополнительной информации по вопросам оптимизации:
Убийцы оптимизации: управляющие аргументы

Параметр остатка ES6 как способ обхода объекта аргументов

В ES2015 / ES6 можно использовать параметр rest ( ... ) вместо объекта arguments в большинстве мест. Скажем, у нас есть следующая функция (не-ES6):

function getIntoAnArgument() { 
  var args = arguments.slice(); 
  args.forEach(function(arg) { 
    console.log(arg); 
  }); 
} 

Эту функцию можно заменить в ES6:

function getIntoAnArgument(...args) { 
  args.forEach(arg => console.log(arg)); 
} 

Обратите внимание, что мы также использовали стрелочную функцию для сокращения обратного вызова forEach!

Объект arguments недоступен внутри тела стрелочной функции.

Параметр rest всегда должен быть последним аргументом в определении вашей функции.

function getIntoAnArgument(arg1, arg2, arg3, ...restOfArgs /*no more arguments allowed here*/) {
  //function body 
}