Одна из вещей, в которой мне никогда не удавалось убедить Крокфорда, - это допускать провалы в описании дела.
В настоящее время это нормально:
switch (foo) {
Дело 1:
случай 2:
сделай что-нибудь();
}
Но это не так:
switch (foo) {
Дело 1:
doSomethingFirst ();
случай 2:
сделай что-нибудь();
}
В версии JSLint, которую я взломал раньше, я проверил комментарий / _falls through_ /, указывающий на то, что вы собираетесь провалиться:
switch (foo) {
Дело 1:
doSomethingFirst ();
/ _падение через_ /
случай 2:
сделай что-нибудь();
}
Мне бы очень хотелось, чтобы это было включено в JSHint, так как это очень долго мучило меня в JSLint.
Кроме того, из # 11 - JSHint, вероятно, должен иметь возможность разрешить падение до default
.
Поскольку чаще всего провал кейса бывает непреднамеренным, я не добавил отдельную опцию, чтобы просто игнорировать сообщение. Вместо этого я повторно использовал ваш подход с явным комментарием о том, что провал является преднамеренным.
switch (foo) { Дело 1: dosmth (); / * проваливается * / случай 2: dosmth (); }
Связанный коммит: 4a72da1.
Отлично, спасибо!
IIRC, Крокфорд конкретно упоминает в своей книге, почему ему не нравится провал дела. История одновременно забавна и несколько унизительна.
Извините за комментарий, но предупреждение по-прежнему срабатывает для case
s с выбросом в конце блока. Вы можете отключить предупреждение с помощью аннотации /* falls through */
, но эта аннотация "нарушается" (в том смысле, что в конце концов появляется предупреждение) чем-либо, кроме пробела между предыдущим случаем, аннотацией и следующей. случае, поэтому я даже не могу прокомментировать, почему этот комментарий там.
Комментарий /* falls through */
вместо break;
- недокументированная функция. Пожалуйста, добавьте это в документы.
Дополнительные комментарии можно добавить в строку перед /* falls through */
.
Прикомандированный. Добавьте в документы /*falls through*/
.
Также добавьте поддержку для:
case 'none':
default:
Хотя технически случай 'none'
не нужен, он делает код более читабельным.
+1 за добавление информации об этом в документы.
Интересно, что недавно я обнаружил ситуацию, когда "провалы" в делах имеют смысл. Я использовал это для выполнения миграции версионных данных, прочитанных из localStorage. Бывший:
function migrate( version, data ) {
switch( version ) {
case 1 :
data.new1 = data.old; // convert data from version 1 to version 2
delete data.old;
case 2 :
data.new2 = data.new1; // convert data from version 2 to version 3
delete data.new1;
}
return data; // return data in version 3 format
}
По мере развития формата данных код можно поддерживать, добавляя кейсы для миграции более старых версий, и применяются все миграции для доведения конкретной версии до последней.
Для тех, кто ищет ключ объекта .jshintrc
:
"-W086": true, //allow fall-through
Самый полезный комментарий
Для тех, кто ищет ключ объекта
.jshintrc
: