switch语句内部表达式调用次数及toLowerCase()执行机制咨询
Switch语句中
toLowerCase()的调用次数解析 嘿,这个问题问到点子上了——咱直接给结论:text.toLowerCase()只会被调用一次,绝对不会在每个case检查时重复执行!
为啥是这样?
JavaScript里switch语句的执行逻辑是固定的:
- 第一步:先计算switch括号里的控制表达式(也就是你写的
text.toLowerCase()),把计算结果临时存起来。 - 第二步:逐个取出每个
case后面的表达式,和刚才预存的结果做匹配,匹配成功就执行对应的代码块。
不管你有多少个case分支,控制表达式只在进入switch时计算一次,后续所有case的匹配都用这个预存的结果。
要不要提前赋值给变量?
有人会建议把text.toLowerCase()的结果先存到变量里再用在switch里,这不是因为性能问题(毕竟toLowerCase()是轻量调用),而是为了代码可读性:
- 如果后续需要修改这个小写化的逻辑,只需要改一次变量赋值的地方,不用动switch的控制表达式。
- 代码看起来更清晰,一眼就能知道用的是哪个值来做匹配。
比如优化后的代码可以写成这样:
const lowerCaseText = text.toLowerCase(); switch(lowerCaseText) { case "aaa": doSomething(); return; case "bbb": doSomething(); return; case "ccc": doSomething(); return; default: return; }
给你个验证小例子
你可以自己跑一下这段代码,看看调用次数:
// 模拟一个带调用计数器的toLowerCase方法 let callCounter = 0; const testText = { toLowerCase() { callCounter++; console.log(`toLowerCase被调用了${callCounter}次`); return "aaa"; } }; switch(testText.toLowerCase()) { case "aaa": console.log("匹配到aaa"); break; case "bbb": console.log("匹配到bbb"); break; default: console.log("进入默认分支"); } // 最终输出callCounter的值是1,证明只调用了一次 console.log(`总调用次数:${callCounter}`);
内容的提问来源于stack exchange,提问作者shahaf
相关产品推荐
相关产品推荐

