优化JavaScript中的switch语句

来自菜鸟教程
跳转至:导航、​搜索

switch 语句 对于某些编程任务是必不可少的。 在本文中,您将学习如何使用 switch 并希望获得直觉,知道何时应该使用它。

使用 switch 的一个标志是当您有很多连续的 if/else 语句时。 让我们看一个使用 if/else 的示例,然后我们将查看 switch 等价物进行比较:

let dayIndex = new Date().getDay();
let day;

if (dayIndex === 0) {
  day = 'Sunday';
}
else if (dayIndex === 1) {
  day = 'Monday';
}
else if (dayIndex === 2) {
  day = 'Tuesday';
}
else if (dayIndex === 3) {
  day = 'Wednesday';
}
else if (dayIndex === 4) {
  day = 'Thursday';
}
else if (dayIndex === 5) {
  day = 'Friday';
}
else if (dayIndex === 6) {
  day = 'Saturday';
};

console.log(day); // "Friday"

你知道吗? JavaScript 没有获取星期几的本地方法!


使用 if/else 真的很冗长,并且包含许多 switch 可以轻松处理的不必要的样板:

let dayIndex = new Date().getDay();
let day;

switch (dayIndex) {
  case 0:
    day = "Sunday";
    break;
  case 1:
    day = "Monday";
    break;
  case 2:
    day = "Tuesday";
    break;
  case 3:
    day = "Wednesday";
    break;
  case 4:
    day = "Thursday";
    break;
  case 5:
    day = "Friday";
    break;
  case 6:
    day = "Saturday";
    break;
};

console.log(day); // "Friday"

几乎没有任何代码,而且令人耳目一新。 这是因为 switch 重点放在可能的值 上,而不是值 条件上。

使用中断

由于 JavaScript 将多次浏览整个 case 分支,因此建议使用 break 来防止意外的 case 匹配或使引擎不必解析额外的代码。

switch (dayIndex) {
  case 0:
    day = "Sunday";
    break;
  case 1:
    day = "Monday";
    break;
  case 2:
    day = "Tuesday";
    break;
  case 3:
    day = "Wednesday";
    break;
  case 4:
    day = "Thursday";
    break;
  case 5:
    day = "Friday";
    break;
  case 6:
    day = "Saturday";
    break;
}

在此示例中,break 实际上并没有提供任何额外的安全性,因为 case 2 永远不可能是 case 5(例如),因此 break 有点无关紧要。 这种对 break 的严格使用似乎是开发人员喜欢使用分号 (;) 的优先事项。 采用显式编程方法的开发人员将对每个 case 使用 break,而一些开发人员仅在 switch 中策略性地使用 break。 然而,全面使用它会带来轻微的性能提升,因为即使没有机会让另一种情况为真,至少您甚至不会让引擎运行其余的 switch 语句。

“break”的策略性使用

有时您实际上会希望您的案件“失败”。 对这些实例使用 break 更多的是一种策略,而不是一种安全措施。

let seasonIndex = new Date().getMonth();
let season;

switch (seasonIndex) {
  case 0:
  case 1:
  case 2:
    season = 'Winter'; // January, February, March
    break;
  case 3:
  case 4:
  case 5:
    season = 'Spring'; // April, May, June
    break;
  case 6:
  case 7:
  case 8:
    season = 'Summer'; // July, August, September
    break;
  case 9:
  case 10:
  case 11:
    season = 'Autumn'; // October, November, December
    break;
}

在此示例中,案例“失败”,break 用于提前明确退出 switch。 这允许您将多个案例与单个值合并在一起。

if/else 版本需要使用大量 || 逻辑运算符,这些运算符看起来并不透明:

 if (seasonIndex === 0 || seasonIndex === 1 || seasonIndex === 2) {
   season = 'Winter';
 } else if (seasonIndex === 3 || seasonIndex === 4 || seasonIndex === 5) {
   season = 'Spring';
 } else if (seasonIndex === 6 || seasonIndex === 7 || seasonIndex === 8) {
   season = 'Summer';
 } else if (seasonIndex === 9 || seasonIndex === 10 || seasonIndex === 11) {
   season = 'Fall';
 }

处理违约案件

switch 的另一个特性是能够处理意外或一般情况。 回到我们的第一个例子,我们可以使用 default 来实现错误处理:

let dayIndex = new Date().getDay();
let day;

switch (dayIndex) {
  default:
    day = new Error('Invalid argument: "dayIndex" must be an integer from 0 –> 6');
  case 0:
    day = 'Sunday';
    break;
  case 1:
    day = 'Monday';
    break;
  case 2:
    day = 'Tuesday';
    break;
  case 3:
    day = 'Wednesday';
    break;
  case 4:
    day = 'Thursday';
    break;
  case 5:
    day = 'Friday';
    break;
  case 6:
    day = 'Saturday';
    break;
}

您可能已经注意到 default 外壳放置在顶部。 不用担心! 它将按预期工作,因为 JavaScript 会在确定 default 之前遍历所有 case 分支。

您还可以将 default 用于您的通用案例:

let beverage = 'Mr. Pibb';
let cost;

switch (beverage) {
  default:
    cost = 0.05;
  case 'Pepsi':
    cost = 1.00;
    break;
  case 'Coca-Cola':
    cost = 1.00;
    break;
  case 'Dr. Pepper':
    cost = 2.00;
    break;
  case 'Moutain Dew':
    cost = 5.00;
    break;
}

console.log(cost); // 0.05

这可以确保您从 switch 中获得一些排序值,即使它与您定义的任何 cases 都不匹配。

结论

当您发现自己要编写大量连续的 if/else 语句时,switch 语句是一个不错的选择。 即使您可能不像 for-loop 那样频繁地使用 switch,但在您需要时也没有替代品。 LodashRedux 等现代库今天仍在使用 switch,这使其成为 JavaScript 的那些老派主力功能之一,您将始终需要掌握腰带。

要了解有关 switch 的更多信息,请访问 Mozilla Developer 网站。