关于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可做不到。
总结
果然不能太过自信啊,须时刻保持虚心,不过还是有收获的,且和人讨论还是需要敢于发言,敢于质疑,否则今天可能就错过这段代码了,当然也得敢于承认错误。
评论