Недавно я узнал, что вы можете использовать аккуратный оператор switch с fallthrough для установки значений аргументов по умолчанию в 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";
}
}
Мне это очень понравилось , поскольку он не только очень короткий, но и работает на основе фактически переданных параметров, не полагаясь на наличие специального класса значений (null, ложь и т. д.), которые служат в качестве заполнителей, как в более традиционных версиях:
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
для реальных случаев, когда я хочу проверить правдивость вместо того, чтобы использовать его как общее правило для установки параметров по умолчанию.
Тем не менее, я нашел очень мало примеров этого шаблона при поиске кода , поэтому мне пришлось надеть шляпу скептика. Почему я не нашел больше примеров этой идиомы?
Некоторые причины, по которым я (и некоторые из комментариев) мог бы подумать, чтобы избежать переключателя ( arguments.length)
:
Использование именованных параметров, передаваемых через литерал объекта, очень гибкое и расширяемое. Может быть, места, где дополнительные аргументы могут быть необязательными, используют это вместо этого?
Возможно, большую часть времени мы действительно хотим проверить правдивость? Использование категории значений в качестве держателей имен также позволяет отображать параметры по умолчанию в середине, а не только в конце: myFunc ('arg1', null, 'arg3')
Возможно, большинство людей просто предпочитают очень короткие arg = arg || "по умолчанию"
и большую часть времени нас просто не волнуют ложные значения?
Возможно, доступ к аргументам
является злом / неэффективным?
плохая часть, о которой я не подумал?
Достаточно ли этих минусов, чтобы избежать использования switch (arguments.length)
в качестве основного шаблона аргумента по умолчанию, или это изящный трюк, который я должен сохранить и использовать в своем code?