Параметры по умолчанию

Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.

Сводка

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

Синтаксис

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

Описание

В JavaScript стандартное значение параметров функций undefined. Однако, в некоторых случаях может быть полезно задать иное значение по умолчанию. Для таких ситуаций предназначены параметры по умолчанию.

Ранее для проверки и задания стандартных значений использовалось тело функции, где параметры сравнивались с undefined. В приведённом ниже примере, для параметра b не передано значение при вызове функции, в результате он будет иметь значение undefined  и результатом вычисления a*b в функции multiple может быть значение NaN. Однако, этот случай отслеживается на второй строке примера:

function multiply(a, b) {
  b = typeof b !== 'undefined' ?  b : 1;

  return a*b;
}

multiply(5); // 5

С параметрами по умолчанию проверка их значений в теле функции более не требуется. Вам достаточно указать 1 в качестве значения по умолчанию для параметра b в заголовке функции:

function multiply(a, b = 1) {
  return a*b;
}

multiply(5); // 5

Примеры

Передача undefined

Во втором вызове функции в приведённом примере, даже при явном указании undefined параметру color, он будет иметь значение по умолчанию:

function setBackgroundColor(element, color = 'rosybrown') {
  element.style.backgroundColor = color;
}

setBackgroundColor(someDiv);            // color имеет значение 'rosybrown'
setBackgroundColor(someDiv, undefined); // color также имеет значение 'rosybrown'
setBackgroundColor(someDiv, 'blue');    // color имеет значение 'blue' 

Вычисляются во время вызова

Параметры по умолчанию вычисляются во время вызова функции, в отличие от языков типа Python. Новый объект создаётся при каждом вызове функции:

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], а не [1, 2]

Это также применимо к функциям и переменным:

function callSomething(thing = something()) { return thing }

callSomething(); //вызовет ReferenceError

let (something = function() "sth") {
  callSomething(); //"sth"
}

Необязательные параметры

Значения по умолчанию будут заданы для всех не переданных параметров:

function singularAutoPlural(singular, plural = singular+"s", 
                            rallyingCry = plural + " ATTACK!!!") {
  return [singular, plural, rallyingCry ]; 
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural("Gecko");

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural("Fox","Foxes");

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural("Deer", "Deer", "Deer peaceably and respectfully
   petition the government for positive change.")

Для сравнения данная возможность может быть легко реализована следующим образом:

function go() {
  return ":P"
}

function withDefaults(a, b = 5, c = b, d = go(), e = this, 
                      f = arguments, g = this.value) {
  return [a,b,c,d,e,f,g];
}
function withoutDefaults(a, b, c, d, e, f, g){
  switch(arguments.length){
    case 0:
      a
    case 1:
      b = 5
    case 2:
      c = b
    case 3:
      d = go();
    case 4:
      e = this
    case 5:
      f = arguments
    case 6:
      g = this.value;
    default:
  }
  return [a,b,c,d,e,f,g];
}

withDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]


withoutDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]

Определение функций в теле функции

Было представлено в Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Функции, определённые в теле самой функции, не могут быть использованы в качестве значений по умолчанию и вызывают ReferenceError (в настоящий момент TypeError в SpiderMonkey, смотрите баг 1022967). Параметры по умолчанию вычисляются в первую очередь, а функции, опредённые в теле функции, вычисляются впоследствии.

// Не работает! Вызывает ReferenceError.
function f(a = go()) {
  function go(){return ":P"}
}

Порядок следования параметров

До версии Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2), следующий код приводил к SyntaxError. Это было исправлено в баг 777060 и сейчас работает должным образом:

function f(x=1, y) { 
  return [x, y]; 
}

f(); // [1, undefined]

Спецификации

Спецификация Статус Комментарий
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Определение функций' в этой спецификации.
Стандарт Изначальное определение.

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка 49 15.0 (15.0) Нет 36 Нет
Возможность Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка (Да) 49 15.0 (15.0) Нет 36 Нет

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: I-O, esusekov, dtretyakov
 Обновлялась последний раз: I-O,