最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Is a reversed switch statement acceptable JavaScript? - Stack Overflow

programmeradmin11浏览0评论

JSLint is plaining that (true) is a weird condition. Which is understandable if I wasn't using it on a reversed switch statement. So is JSLint wrong or should I not be using reversed switch statements?

Thanks for any help/enlightenment.

switch (true) {
    case (menuLinksLength < 4):
        numberOfColumns = 1;
        break;
    case (menuLinksLength > 3 && menuLinksLength < 7):
        numberOfColumns = 2;
        break;
    case (menuLinksLength > 6 && menuLinksLength < 10):
        numberOfColumns = 3;
        break;
    case (menuLinksLength > 9):
        numberOfColumns = 4;
        break;
    default:
        numberOfColumns = 0;
}

JSLint is plaining that (true) is a weird condition. Which is understandable if I wasn't using it on a reversed switch statement. So is JSLint wrong or should I not be using reversed switch statements?

Thanks for any help/enlightenment.

switch (true) {
    case (menuLinksLength < 4):
        numberOfColumns = 1;
        break;
    case (menuLinksLength > 3 && menuLinksLength < 7):
        numberOfColumns = 2;
        break;
    case (menuLinksLength > 6 && menuLinksLength < 10):
        numberOfColumns = 3;
        break;
    case (menuLinksLength > 9):
        numberOfColumns = 4;
        break;
    default:
        numberOfColumns = 0;
}
Share Improve this question edited Oct 5, 2011 at 8:52 CharlesB 90.5k29 gold badges201 silver badges228 bronze badges asked Oct 5, 2011 at 8:31 moefinleymoefinley 1,3391 gold badge15 silver badges28 bronze badges 3
  • For what it's worth, you can keep your reversed switch statement and still satisfy the linter if you use switch(true===true). This is not an endorsement of the practice ;) – Derek Prior Commented May 11, 2012 at 16:13
  • switch(true===true) doesn't help, as that then causes it to plain about a "Weird relation." – Michael Fenwick Commented Jul 26, 2013 at 17:48
  • var theTruth = true; ----- switch(theTruth) {...} – dbrin Commented Aug 26, 2013 at 22:54
Add a ment  | 

4 Answers 4

Reset to default 5

Personally I wouldn't like seeing reversed switch in a code base. It doesn't buy you anything when pared to a plain if/elseif block, and its exotic nature can be cause for confusion.

That's also what JSLint is plaining about:

You are doing something unorthodox. Is there a good reason for it? If not, it might be better to stick to the basics.

The third edition of the ECMA-262 standard (supported by Firefox 1.0+, Google Chrome 1.0+, MSIE 5.5+ and others) defines that

switch (expression) {
    case label1:
        statements1
    .
    .
    .
}

executes statements1 if (expression) matches label1.

That means that your switch statement is perfectly fine.

I tried it out on Firefox, Chrome and IE. None plains...

Edit:

Now the guessing part:

JSLint is a code anaylisis tool. When it sees switch (true), it assumes that you don't know what you're doing. Weird doesn't mean necessarily wrong...

numberOfColumns = Math.max(4, Math.floor(menuLinksLength / 3));

This will give you identical results to your existing code. Your question is fairly ambiguous, as "acceptable" is a very subjective term. I would personally reject any merge request with a reversed switch statement, because I actually can't think of a situation where that couldn't be replaced with something simpler and/or easier to read.

Whether or not a "reverse switch" is considered good practice in javascript depends on the specific use case.

In general, a reverse switch can make the code more readable and maintainable by clearly defining the intended behaviour for cases that don't match a specific pattern. This can be useful in situations where you want to catch all edge cases or exceptions that are not explicitly defined in the switch statement.