Недавно я узнал, что вы можете использовать опрятный оператор 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";
}
Мое внутреннее, хотя, увидев версию с помощью коммутатора, я подумал, что я должен использовать ее по умолчанию в версии ||
.
Коммутатор fallthough делает его не намного дольше, и он имеет то преимущество, что он гораздо более "надежный", поскольку ему не нужны типы параметров. В общем случае кажется, что не стоит беспокоиться о том, что произойдет со всеми значениями ложности ('', 0, null, false...), когда мне нужно создать функцию с параметрами по умолчанию.
Затем я зарезервировал arg = arg || x
для фактических случаев, когда я хочу проверить правдоподобие вместо того, чтобы перепрофилировать его как общее правило для дефолта параметра.
Однако, я нашел несколько примеров этого шаблона, когда я сделал поиск кода, поэтому мне пришлось надеть свою скептическую шляпу. Почему я не нашел больше примеров этой идиомы?
- Это сейчас очень хорошо известно?
- Разве я не искал достаточно хорошо? Я запутался в большом количестве ложных срабатываний?
- Есть ли что-то, что уступает его альтернативам?
Некоторые причины, по которым я (и некоторые комментарии) могли подумать об избежании switch(arguments.length)
:
-
Использование именованных параметров, передаваемых через литерал объекта, является очень гибким и расширяемым. Возможно, места, где больше аргументов могут быть необязательными, используют это вместо этого?
-
Возможно, большую часть времени мы хотим проверить правдивость? Использование категории значений в качестве наблюдателей также позволяет использовать параметры по умолчанию в середине, а не только в конце:
myFunc('arg1', null, 'arg3')
-
Возможно, большинство людей предпочитают очень короткое
arg = arg || "default"
, и большую часть времени мы просто не заботимся о значениях ложности? -
Возможно, доступ к
arguements
является злым/неперспективным? -
Возможно, этот провал в виде такого рода ошибок имеет плохую часть, о которой я не думал?
Являются ли эти недостатки достаточными, чтобы избежать использования switch(arguments.length)
в качестве шаблона аргумента по умолчанию для штапеля или это отличный прием, который я должен сохранить и использовать в своем коде?