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 级别捕获此问题,但是很少有理由使用 switchif/else if 或对象 - 因为 switch 比不常见 if,较少的开发人员对语义感到满意 switch

© 版权声明
评论 抢沙发

请登录后发表评论