如果我这样做会更好:
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;
}
答案 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;