Является ли хорошей идеей использовать переключатель с переходом для обработки аргументов по умолчанию в Javascript?

Недавно я узнал, что вы можете использовать аккуратный оператор 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?

28
задан hugomg 8 February 2012 в 17:34
поделиться