• Теория
  • Теория

Порядок параметров

В прошлом задании мы столкнулись со странным значением - NaN. Оно означает «not a number» и говорит о том, что невозможно найти результат математической операции. Разберём, откуда взялось NaN. Если у функции указан параметр, но аргумент не передан, то значение параметра в теле функции будет undefined — то есть «не определено». Арифметические операции с undefined дают NaN.

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

let calculateMiles = function (distance) {
  …
  // Если аргумент не передан, в переменную запишется NaN
  let miles = distance * percent;
  …
}

С аргументами есть и другой нюанс — передавать их надо в том же порядке, в котором объявлены параметры функции.

Отвлечёмся ненадолго от подсчёта миль и поговорим о литературных предпочтениях. У нас есть функция getFavoriteBook, которая выводит в консоль сообщение о любимой книге пользователя. У неё есть два параметра: первый называется userName (имя пользователя), второй bookName (название книги).

let getFavoriteBook = function (userName, bookName) {
  console.log('Меня зовут ' + userName + '. Моя любимая книга: ' + bookName);
}

Допустим, нашего пользователя зовут Семён, а его любимая книга «Ёжик в тумане». Передадим эти аргументы в функцию. Сначала название книги, а затем имя пользователя:

let getFavoriteBook = function (userName, bookName) {
  // Параметр userName хранит 'Ёжик в тумане'
  // Параметр bookName хранит 'Семён'
  …
}

// Вызываем функцию
getFavoriteBook('Ёжик в тумане', 'Семён');
// Выведет: Меня зовут Ёжик в тумане. Моя любимая книга: Семён

Кажется что-то пошло не так. Почему мы получили такой результат? Мы ведь передали имя пользователя и название книги — всё, как положено.

Всё дело в порядке переданных значений. Параметры работают, как переменные — значение из аргумента записывается в параметр, а потом используется внутри функции по имени. В нашем случае всё так и произошло. Первый параметр функции — userName, первый аргумент — 'Ёжик в тумане'. Этот аргумент и записался в параметр userName, а аргумент 'Семён' стал параметром bookName. Вы, конечно, знаете, где тут имя, а где название книги, а вот JavaScript нет. Он всё понимает буквально: что первым передали, то и стало первым параметром. Потому что порядок аргументов соответствует порядку параметров в функции. У нас параметры записаны в таком порядке: userName, bookName. Значит, первым должно быть передано имя пользователя, а затем название книги. И никак иначе.

let getFavoriteBook = function (userName, bookName) {
  // Параметр userName хранит 'Семён'
  // Параметр bookName хранит 'Ёжик в тумане'
  …
}

// Вызываем функцию
getFavoriteBook('Семён', 'Ёжик в тумане');
// Выведет: Меня зовут Семён. Моя любимая книга: Ёжик в тумане

Видите, мы передали аргументы в правильном порядке и сообщение стало корректным.

Потренируемся вызывать функцию с разным порядком аргументов.

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

Минимальный вид табов
  • index.html
HTML
HTML

Вы перешли на другую страницу

Кликните внутри мини-браузера, чтобы поставить фокус в это окно.

100%
Бабушка Кекс

Притормози, дружище

Проходить вызовы части «Функции» тренажёра «Базовые структуры данных» можно после регистрации и оформления подписки.