Эта статья нуждается в редакционном обзоре. Как вы можете помочь.
Это экспериментальная технология, часть предложения 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 | Нет |