JS Drip #1 Параметры по умолчанию в Javascript
Опубликовано Пн. 22 Декабрь 2014 в Translations
Вольный перевод Js Drip #1 Default Parameters in JavaScript
Такие языки как Ruby, CoffeeScript и будущие версии Javascript [1] позволяют задавать параметры по умолчанию при определении функции. Это выглядит примерно так:
function myFunc(param1, param2 = "second string") {
console.log(param1, param2);
}
// Выведет: "first string" и "second string"
myFunc("first string");
// Выведет: "first string" и "second string version 2"
myFunc("first string", "second string version 2");
Увы, эта конструкция не доступна в текущей версии Javscript. Что мы можем сделать, чтобы достичь такого поведения с нынешними возможностями?
Простейшее решение выглядит так:
function myFunc(param1, param2) {
if (param2 === undefined) {
param2 = "second string";
}
console.log(param1, param2);
}
// Выведет: "first string" и "second string version 2"
myFunc("first string", "second string version 2");
Этот прием зависит от того факта, что параметр пропущеный во время вызова всегда равен undefined. И это хорошее решение, если у вас есть только один параметр. Но что делать, если у вас их несколько?
В этом случае вам, вероятно, следует передавать в параметре объект, так как это дает преимущество, т.к. необходимо явно называть все, что вы хотите передать. И если вы передаете в качестве параметра объект, то имеет смысл объявить параметры по умолчанию таким же образом.
function myFunc(paramObject) {
var defaultParams = {
param1: "first string",
param2: "second string",
param3: "third string"
};
var finalParams = defaultParams;
// Мы перебираем все свойства paramObject
for (var key in paramObject) {
// Если текущее свойство не было унаследовано, то обрабатываем
if (paramObject.hasOwnProperty(key)) {
// Если текущее свойство определено,
// добавляем его в finalParams
if (paramObject[key] !== undefined) {
finalParams[key] = defaultParams[key];
}
}
}
console.log(finalParams.param1,
finalParams.param2,
finalParams.param3);
}
Это немного громоздко, так что если вы часто используете эту схему, то имеет смысл извлечь перебор и логику фильтрации в отдельную функцию. К счастью, умные люди, которые пишут JQuery и underscore, сделали это в соответствующих extend методах. [2] [3]
Вот обновленная версия, которая использует метод extend библиотеки underscore для достижения того же результата.
function myFunc(paramObject) {
var defaultParams = {
param1: "first string",
param2: "second string",
param3: "third string"
};
var finalParams = _.extend(defaultParams, paramObject);
console.log(finalParams.param1,
finalParams.param2,
finalParams.param3);
}
// Вывод:
// "My own string" и "second string" и "third string"
myFunc({param1: "My own string"});
Вот так вы можете использовать параметры по умолчанию в текущих версиях JavaScript.