关于switch另一种用法

背景

今天跟群友辩论:某段代码是否可以用switch优化一段if else,我当时挺自信的说不能,然后对方说可以,并给出了以下这段代码:

const number = 109;
switch (true) {
  case number >= 90:
    console.log('大于90', number);
    break;
  case number >= 80:
    console.log('大于80', number);
    break;
  case number >= 70:
    console.log('大于70', number);
    break;
  case number < 5:
    console.log('小于5');
    break;
}

固有印象

我起初还是认为不行的:case虽然有条件,但是实际值仍然是true|false,那么如何能判断呢?

认知

但是慢慢看了之后发现这段代码挺妙的,它的switch并不是某个变量,而是固定的true,是用true去判断所有的case,所以虽然case的值仍然是true|false但仍然能真正的判断对应的值,而且比起if else看起来更舒适一些。

举一反三

使用object也可以做到类似的效果:

const n = 20;
const o = {
  [n <= 30]: 30,
  [n <= 20]: 20,
  [n <= 10]: 10
}; // {true: 20; false: 10}
console.log(o[true]); // 20

不过object也不是完全可以代替switch使用,毕竟switch的case可以去掉break达到fallthrough的效果,object可做不到。

总结

果然不能太过自信啊,须时刻保持虚心,不过还是有收获的,且和人讨论还是需要敢于发言,敢于质疑,否则今天可能就错过这段代码了,当然也得敢于承认错误。

评论

0 / 800
全部评论()