@MooGoo 的switch (true) 会给你一个Weird condition error in jsLint,所以让我们多一些创意,以防出现问题,并且,我认为,增加一点可读性。
所以我们不评估每个case 是true 还是false;我们正在比较 case 的值是否等于我们的 switch 术语。因此,让我们通过在我们的 case 语句中添加一个速记 if 来利用这一点,并如果条件为真则返回我们原来的 switch 项。
我还提供了一个现实世界的示例,您希望有两个“默认值”——一个如果您的术语在正方向上超出您的“重要”范围,另一个如果您是反方向。
关键词:
case (x > 0 ? x : null):
“如果我的任期 x 大于零,则返回 x 以便 x === x 和我进行案例分支。”
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, and only NaN, will compare unequal to itself”(双 或 三=)。
这也意味着打开NaN 值(并且仅 NaN 值)将总是在ANY中点击default strong> 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!!!! ...)');