Learning Book

Параметры и аргументы

Параметры и аргументы

Параметры — переменные в определении функции. Аргументы — значения, переданные при вызове.

Дефолтные параметры (ES6)

function greet(name = 'Гость', greeting = 'Привет') {
  return `${greeting}, ${name}!`;
}

greet()               // 'Привет, Гость!'
greet('Иван')         // 'Привет, Иван!'
greet('Иван', 'Здравствуй') // 'Здравствуй, Иван!'
greet(undefined, 'Привет') // 'Привет, Гость!' — undefined триггерит дефолт
greet(null, 'Привет') // 'Привет, null!' — null НЕ триггерит дефолт

Дефолты могут использовать предыдущие параметры:

function createUser(name, role = 'user', id = `${role}_${Date.now()}`) {
  return { name, role, id };
}

Rest параметры

...rest собирает все оставшиеся аргументы в массив:

function sum(...numbers) {
  return numbers.reduce((total, n) => total + n, 0);
}
sum(1, 2, 3, 4, 5); // 15
sum();              // 0 — пустой массив

// Комбинация с обычными параметрами
function log(level, ...messages) {
  console.log(`[${level}]`, messages.join(' '));
}
log('INFO', 'Пользователь', 'вошёл');
Rest параметр должен быть последним. function f(a, ...rest, b) — SyntaxError.

arguments объект (устаревший)

До ES6 для переменного числа аргументов использовался arguments:

function sum() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

arguments — не настоящий массив (нет .map, .filter). Недоступен в стрелочных функциях. Предпочитайте rest-параметры.

Передача объекта как параметра

Для функций с 3+ параметрами — используйте деструктуризацию:

// Плохо — порядок важен, трудно читать при вызове
function createUser(name, email, role, age, isActive) { ... }
createUser('Иван', 'ivan@example.com', 'admin', 25, true);

// Хорошо — именованные параметры
function createUser({ name, email, role = 'user', age, isActive = true }) {
  return { name, email, role, age, isActive };
}
createUser({ name: 'Иван', email: 'ivan@example.com', role: 'admin', age: 25 });

JavaScript всегда передаёт по значению. Но для объектов значением является ссылка:

function mutate(obj) {
  obj.x = 42; // Мутируем оригинал через ссылку!
}

function reassign(obj) {
  obj = { x: 42 }; // Переназначаем локальную переменную — оригинал не меняется
}

const o = { x: 1 };
mutate(o);    // o.x === 42 — изменился!
reassign(o);  // o.x === 42 — оригинал не изменился