switch
语句 计算一个表达式,并根据它执行一个代码块 case
表达式。
const hero = Batman;
let sidekick;
switch (hero) {
case Batman:
sidekick = Robin;
break;
case Aquaman:
sidekick = Aqualad;
break;
case Superman:
sidekick = Jimmy Olsen;
break;
default:
throw new Error(Unknown hero);
}
sidekick; // Robin
确保你不会忘记 break
块末尾的语句,如果你不放一个 break
结尾的声明 case
块,JavaScript 将失败到下一个 case
.
const hero = Batman;
let sidekick;
switch (hero) {
case Batman:
sidekick = Robin;
// Unless theres a `break`, JavaScript will execute the next
// `case` block.
// break;
case Aquaman:
sidekick = Aqualad;
break;
case Superman:
sidekick = Jimmy Olsen;
break;
default:
throw new Error(Unknown hero);
}
// JavaScript executed both the Batman and Aquaman blocks,
// so you get the wrong `sidekick`.
sidekick; // Aqualad
这种行为有一些好处。 您可以对多个执行一个块 case
陈述。 例如:
const sidekick = Nightwing;
let hero;
switch (sidekick) {
// The Robin and Nightwing cases are fallthrough `case`
// statements. They execute the same code block as the Bluebird
// case.
case Robin:
case Nightwing:
case Bluebird:
hero = Batman;
break;
case Aqualad:
case Tempest:
hero = Aquaman;
break;
default:
throw new Error(Unknown sidekick);
}
hero; // Batman
Equality Check
switch
语句对给定表达式求值一次,并将其与每个表达式进行比较 case
表达式 严格相等 。 下面 if
语句在功能上等同于第一个示例:
const hero = Batman;
let sidekick;
if (hero === Batman) {
sidekick = Robin;
} else if (hero === Aquaman) {
sidekick = Aqualad;
} else if (hero === Superman) {
sidekick = Jimmy Olsen;
} else {
throw new Error(Unknown hero);
}
sidekick; // Robin
因为 switch
语句使用严格相等,如果要比较对象(如 日期 或 MongoDB ObjectIds 。
const date = new Date(2020/07/04);
let holiday;
const goodFriday = new Date(2020/04/10);
const independenceDay = new Date(2020/07/04);
const christmas = new Date(2020/12/25);
// Strict equality means two dates arent equal unless theyre
// the same object reference.
date === independenceDay; // false
// `date` is an object, so you need to make sure you convert the
// date to a number using `getTime()`. Otherwise none of the
// cases will hit.
switch (date.getTime()) {
case goodFriday.getTime():
holiday = Good Friday;
break;
case independenceDay.getTime():
holiday = Independence Day;
break;
case christmas.getTime():
holiday = Christmas;
break;
}
holiday; // Independence Day
Alternatives
除非你使用 fallthrough case
语句,您可以使用 if
作为替代品 switch/case
,另一种选择是定义一个对象或 映射 ,其中包含要执行的函数 case
:
const hero = Batman;
let sidekick;
const obj = {
Batman: () => { sidekick = Robin; },
Aquaman: () => { sidekick = Aqualad; },
Superman: () => { sidekick = Jimmy Olsen; }
};
// Make sure to use `hasOwnProperty()` if youre using an object,
// otherwise constructor would be a valid `hero`.
if (obj.hasOwnProperty(hero)) {
obj[hero]();
}
sidekick; // Robin
使用条件对象的优点是您可以以编程方式构建对象。 如果你的 switch
语句变得有点过于重复,您可以改为使用 for
环形。
推荐使用
switch
声明带有很多陷阱,例如无意中掉到下一个 case
语句。 ESLint 有一个 no-fallthrough
规则 可以帮助您在 linter 级别捕获此问题,但是很少有理由使用 switch
与 if/else if
或对象 - 因为 switch
比不常见 if
,较少的开发人员对语义感到满意 switch
。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
请登录后查看评论内容