Недавно я узнал, что вы можете использовать аккуратный оператор 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";
}
}
Мне это очень понравилось, так как оно не только очень короткое, но и работает на основе фактически переданных параметров, не полагаясь на специальный класс значений (null, false и т. д.), служащих заполнителями, как в более традиционных версии:
function myFunc(arg1, arg2, arg3){
//replace falsy arguments with their defaults:
arg1 = arg1 || "default1";
arg2 = arg2 || "default2";
arg3 = arg3 || "default3";
}
Поначалу, увидев версию, использующую переключатель, я подумал, что мне следует рассмотреть возможность использования его «по умолчанию» вместо версии ||
.
Переключатель fall, тем не менее, делает его ненамного длиннее, и его преимущество заключается в том, что он гораздо более «надежен» в том смысле, что ему не важны типы параметров. В общем случае кажется хорошей идеей не беспокоиться о том, что произойдет со всеми ложными значениями ('', 0, null, false ...) всякий раз, когда мне нужно сделать функцию с параметрами по умолчанию.
Затем я бы зарезервировал arg = arg || x
для реальных случаев, когда я хочу проверить достоверность, вместо того, чтобы использовать его как общее правило для параметра по умолчанию.
Однако я нашел очень мало примеров этого шаблона, когда я делал поиск кода для него поэтому мне пришлось надеть шляпу скептика. Почему я не нашел других примеров этой идиомы?
- Это сейчас очень хорошо известно?
- Я недостаточно хорошо искал? Меня смутило большое количество ложных срабатываний?
- Есть ли что-то, что делает его хуже альтернатив?
Некоторые причины, которые я (и некоторые из комментариев) мог придумать, чтобы избежать switch(arguments.length)
:
Использование именованных параметров, передаваемых через литерал объекта, очень гибко и расширяемо. Возможно, вместо этого используются места, где больше аргументов может быть необязательным?
Возможно, большую часть времени мы действительно хотим проверить на правдивость? Использование категории значений в качестве заполнителей также позволяет отображать параметры по умолчанию в середине, а не только в конце:
myFunc('arg1', null, 'arg3')
Возможно, большинство людей просто предпочитают очень короткие
arg = arg || "default"
и большую часть времени нас просто не волнуют ложные значения?Возможно, доступ к
arguements
является злом/неэффективным?Возможно, у этого типа провала переключателя есть плохая часть, о которой я не подумал?
Достаточно ли этих недостатков, чтобы избежать использования switch(arguments.length)
в качестве основного шаблона аргумента по умолчанию, или это изящный прием, который мне следует сохранить и использовать в моем коде?
undefined
делаетarguments.length === 2
, в то время как вы, вероятно, захотите заменить переданноеundefined
значением по умолчанию (как это делает||
). - person pimvdb   schedule 05.01.2012$.get(url, callback)
вместо$.get(url, data, callbacl)
.switch
не мог провести различие между разными типами параметров. Это также приведет к ошибке, если будут переданы параметры заполнения, такие какfoo(1, null, 3)
, потому что нужно установить третий параметр, а не второй (edit что сказал pimvdb). Так что, возможно, это причины, по которым он не так популярен; он недостаточно гибкий. - person Felix Kling   schedule 05.01.2012myFunc(undefined, undefined)
не изменит первые дваundefined
, но изменит третийundefined
. - person pimvdb   schedule 05.01.2012