javascript开关()或if()

时间:2011-04-19 03:40:04

标签: javascript if-statement switch-statement

如果我这样做会更好:

if(message == 'redirect')
{
    is_valid.accepted = true;
}
else if(message == 'invalid id')
{
    is_valid.accepted = false;
}
else
{
    is_valid.accepted = false;
}

或者我是这样做的

switch (message)
{
case 'invalid id':
default:
    is_valid.accepted = false;
    break;
case 'redirect':
    is_valid.accepted = true;
    break;
}

6 个答案:

答案 0 :(得分:8)

如果您预见到需要添加大量新案例,则可以使用switch

如果您不会添加许多新案例,我可能会这样做,为清楚起见:

is_valid.accepted = message=='redirect';

(另请注意,您对“无效ID”的检查不执行任何操作)

然而,如果你不得不添加新的东西,请注意它是多么好,你不必重复自己不必重复自己不必重复自己,也不要重复性感:

switch (message)
{
    case 'invalid id':
    case 'penguin invasion':
    case 'the internet is down':
    case 'error not enough caffeine':
        is_valid.accepted = false;
        break;

    case 'redirect':
    case 'upvote me':
    case 'vip':
    case 'flamewar':
        is_valid.accepted = true;
        break;

    default:
        is_valid.accepted = false;
        // perhaps log or something
}

想象一下所有那些丑陋的其他人,如果你不这样做的话。


旁注: 如果你有一个非常复杂的规则,但仍然是一个黑名单 - 单一标志范例,那么:

var blacklist = ['invalid id', 'penguin invasion', 'the internet is down' 'error not enough caffeine'];
var whitelist = ['redirect', 'upvote me', 'vip', 'flamewar'];

is_valid.accepted = whitelist.indexOf(message)!=-1;

如果您想动态构建白名单,也可以这样做。

答案 1 :(得分:2)

这取决于你对更好的定义。您希望它是更好的阅读体验还是更好的表现?

我总是jsPerf的事情。如果它使我的代码更快/更合适,我并不在乎可读性。

这是一堆不同开关的jsPerf与if / else if / if == / if ===语句。

http://jsperf.com/switch-if-else/16

这是测试的第16版。因此,如果您从现在开始查看这10周,请确保滚动到底部并抓住最近的测试。

答案 2 :(得分:2)

switch语句在某些情况下比if/else更有效/更具表现力。而以下if/else声明

let x = 123;

if (x) {/*...*/} // implicit type casting (to boolean)
else {/*...*/}

可以很容易地转换为:

switch (!!x) { // explicit type casting (to boolean)
  case true: /*...*/ break;
  default: /*...*/
}
另一方面

这个switch声明

function algo(x) {/*...performing a complex algorithm...*/}

switch (algo(123)) { // executed once
  case "result 1": /*...*/ break;
  case "result 2": /*...*/ break;
  case "result 3": /*...*/ break;
  default: /*...*/
}

会产生令人难以置信的低效if/else语句(switch效率更高):

if (algo(123) === "result 1") {/*...*/}
else if (algo(123) === "result 2") {/*...*/}
else if (algo(123) === "result 3") {/*...*/}
else {/*...*/}

或要求if/else附加变量,仅为此目的声明:

let y = algo(x); // additional variable

if (y === "result 1") {/*...*/}
else if (y === "result 2") {/*...*/}
else if (y === "result 3") {/*...*/}
else {/*...*/}

请注意,其他元素(如变量)会导致更多复杂性和复杂性,从而使程序更容易出错。 switch语句不需要这样的变量,因为它更具表现力。

答案 3 :(得分:0)

如果您在同一个变量上处理一长串可能的条件,那么切换会更好。在这种情况下,除非您更喜欢语法,否则我认为没有太多理由使用switch()。

答案 4 :(得分:0)

如果你使用if语句,我个人更喜欢在if之上设置默认值,如下所示:

is_valid.accepted = false;
if(message == 'redirect')
{
    is_valid.accepted = true;
}

这样,如果稍后添加更多选项,则始终默认为不太可能中断的安全行为。此外,您可以一目了然地看到默认行为,而无需通读if-then-else逻辑。它的代码要短得多。

答案 5 :(得分:-1)

三元? is_valid.accepted = (message !== 'invalid id') ? true : false;