Недавно я узнал, что вы можете использовать аккуратный оператор switch с указателем, чтобы установить значения аргументов по умолчанию в Javascript:
function myFunc(arg1, arg2, arg3) {
//replace unpassed arguments with their defaults:
switch (arguments.length) {
case 0 : arg1 = "default1";
case 1 : arg2 = "default2";
case 2 : arg3 = "default3";
}
}
Мне очень понравилось, так как он не только очень короткий, но и работает на основе фактически переданных параметров, не полагаясь на наличие специального класса значений (нуль, ложь и т. Д.), Которые служат заполнителями, как в более традиционные версии:
function myFunc(arg1, arg2, arg3){
//replace falsy arguments with their defaults:
arg1 = arg1 || "default1";
arg2 = arg2 || "default2";
arg3 = arg3 || "default3";
}
Однако, после просмотра версии с использованием коммутатора, я должен был рассмотреть вопрос об использовании его «по умолчанию» в версии ||
.
Падение коммутатора делает его ненамного длиннее, и его преимущество в том, что он гораздо более "надежен", поскольку ему не нужны типы параметров. В общем случае это звучит как хорошая идея - не беспокоиться о том, что произойдет со всеми ложными значениями ('', 0, null, false ...) всякий раз, когда мне нужно создать функцию с параметрами по умолчанию.
Я бы тогда зарезервировал arg = arg || x
для реальных случаев, когда я хочу проверить на достоверность, вместо того, чтобы использовать его в качестве общего правила для параметров по умолчанию.
Однако, я нашел очень мало примеров этого паттерна, когда я сделал поиск кода для него, поэтому мне пришлось надеть скептическую шляпу. Почему я не нашел больше примеров этой идиомы?
- Это сейчас очень хорошо известно?
- Разве я не достаточно хорошо искал? Меня смутило большое количество ложных срабатываний?
- Есть ли что-то, что делает его хуже альтернатив?
Некоторые причины, по которым я (и некоторые комментарии) мог придумать, чтобы избежать switch(arguments.length)
:
Использование именованных параметров, передаваемых через литерал объекта, очень гибко и расширяемо. Возможно, места, где больше аргументов могут быть необязательными, используют это вместо этого?
Возможно, большую часть времени мы делаем хотим проверить на правдивость? Использование категории значений в качестве держателей полей также позволяет параметрам по умолчанию отображаться в середине, а не только в конце: myFunc('arg1', null, 'arg3')
Возможно, большинство людей просто предпочитают очень короткие arg = arg || "default"
, и большую часть времени нам просто наплевать на ложные значения?
Возможно, доступ к arguements
является злом / бесполезным?
Возможно, у этого типа коммутатора есть плохая часть, о которой я не думал?
Достаточно ли этих минусов, чтобы избежать использования switch(arguments.length)
в качестве основного шаблона аргумента по умолчанию или это изящный прием, который я должен сохранить и использовать в своем коде?