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

Is a reversed switch statement acceptable JavaScript? - Stack Overflow

programmeradmin1浏览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.

发布评论

评论列表(0)

  1. 暂无评论