switch (true)
@ MooGoo даст вам _ 2_ ошибка в jsLint, так что давайте проявим немного больше творчества на случай, если это проблема, и, я думаю, немного повысим читаемость.
Таким образом, мы не оцениваем, является ли каждый case
true
или false
; мы сравниваем, равно ли значение этого case
нашему switch
члену. Итак, давайте воспользуемся этим, добавив сокращенное обозначение if
в наш case
оператор и вернув исходный член переключения, если условие истинно.
Я также привожу своего рода пример из реального мира, где вы хотите иметь два значения по умолчанию - одно, если ваш термин выходит за пределы вашего важного диапазона в положительном направлении, и другой, если вы находитесь в отрицательном направлении.
Ключевая фраза: case (x > 0 ? x : null):
Если мой член x
больше нуля, верните x
, чтобы x === x
и я взяли ветвь case.
http://jsfiddle.net/rufwork/upGH6/1/
/*global document*/
/*jslint evil:true*/
var x = 10;
switch (x) {
case (x > 0 ? x : null):
document.write('ha ha ha! I fooled switch AND jsLint! Muhahahahaha!');
break;
case 0:
document.write('zero is nothing.');
break;
case -1:
document.write('low');
break;
case -2:
document.write('lower');
break;
case -3:
document.write('lowest I care about');
break;
default: // anything lower than -3.
document.write('TOO LOW!!!! (unless you cheated and didn\'t use an int)');
}
document.write('<br>done.');
Обратите внимание, что переключатель default:
говорит: если вы не обманули и не использовали int, и что для короткого замыкания требуется x === x
при возврате x
.
Но ваша точка зрения является полезным напоминанием о том, что NaN
- это единственный случай, когда короткое замыкание неприменимо.
То есть x
должен == x
закоротить switch
и, как сообщает нам MDN, NaN и только NaN будет сравнивать неравно самому себе (двойной или тройной =
) .
Это также означает, что при включении значения NaN
(и только значения NaN
) всегда попадет default
в ЛЮБОЙ switch
, потому что вы не можете сопоставить его ценность.
Вот полная цитата из MDN :
NaN сравнивает неравное (через ==,! =, === и! ==) с любым другим значением, включая другое значение NaN. Используйте Number.isNaN (). или isNaN (), чтобы наиболее четко определить является ли значение NaN. Или выполните самосравнение: NaN и только NaN будут сравнивать себя неравно.
Вы можете изменить логику default
, чтобы проверить, что у вас есть:
isNaN(x) ? document.write ('nan') : document.write('TOO LOW!!!! ...)');
Или вы даже можете стать хипстером, как предлагает MDN (но, пожалуйста, не надо; ^ D):
x !== x ? document.write ('nan') : document.write('TOO LOW!!!! ...)');
person
ruffin
schedule
15.02.2013