2016-08-03 3 views
2

Это очень похоже на default as first option in switch statement?, но касается JS, а не PHP.Оператор переключения Javascript - по умолчанию сначала ОК?

У меня есть вспомогательная функция, которая обертывает различные стили звонков для другой функции. Обернутая функция требует по крайней мере одного и может принимать до 4 параметров. То, что я делаю, довольно хорошо описано в этом минимальном примере кода, который отлично работает в моих версиях Chrome и FF.

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length) { 
     default: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 

(В реальном использовании они передаются фактической функции, а не console.log). Таким образом, идея состоит в том, чтобы провалиться в случаях, позволяя предоставить слишком много параметров (но игнорируя дополнительные), но не получив, если предоставленное определение пусто.

Итак, я знаю, что, по моему мнению, это работает, по крайней мере, в некоторых браузерах, могу ли я полагаться на это, работая в достаточно современных браузерах (например, устройства iOS/Android, IE8 +, Edge и т. Д.)? Я знаю, что исключение оператора break является корректным поведением и используется довольно широко, но я не уверен в том, что первый и пустой случай по умолчанию (например, если некоторые браузерные JS-движки оптимизируют пустой случай по умолчанию, тогда это не работайте для меня, так как это не сработает при вызове с массивом размером 5, например).

+0

Вашего сценарий работает для меня на Firefox 48. Я думаю, он должен работать на всех JS потому что я не думаю, что какой-либо JS-движок оптимизировал бы случай 'default', потому что это определенно изменило бы поток управления. – Xufox

ответ

2

Я никогда не видел, чтобы кто-то использовал этот подход раньше. Это умно. В качестве примечания стороны, умный - обоюдоострый клинок; если это код, который кто-либо, кроме вас, будет трогать, я настоятельно рекомендую там комментарий, чтобы он дал понять, что вы сделали это специально или кто-то изменит его (потому что он «выглядит неправильно») и нарушает его, не осознавая намерения ,

documentation indicates, что default не является последним пунктом.

Если вы нашли браузеры были это не работает, вы можете изменить его немного, таким образом, и избежать default:

function testSwitch(definition) { 
    var term, minLength, boundaryStart, boundaryEnd; 
    switch (definition.length > 4 ? 5 : definition.length) { 
    case 5: 
    case 4: 
     boundaryEnd = definition[3]; 
    case 3: 
     boundaryStart = definition[2]; 
    case 2: 
     minLength = definition[1]; 
    case 1: 
     term = definition[0]; 
     break; 
    case 0: 
     console.log('fail') 
     return; 
    } 
    console.log(term, minLength, boundaryStart, boundaryEnd); 
} 
+0

Спасибо - я действительно просматривал эту точную страницу, и если бы я увидел, что «По соглашению, предложение по умолчанию - это последнее предложение, но это не обязательно так». цитата тогда он ответил бы на мой вопрос, но я как-то сканировал прямо мимо него каждый раз. Определенно соглашайтесь с тем, что он будет прокомментирован, включая ссылку на этот ответ. –

Смежные вопросы