js switch case语句_你可能不需要在 JavaScript 使用 switch 语句

没有 switch 就没有复杂的代码块

switch很方便:给定一个表达式,我们可以检查它是否与一堆case子句中的其他表达式匹配。考虑以下示例:

const name = "Juliana";switch (name) {  case "Juliana":    console.log("She's Juliana");    break;  case "Tom":    console.log("She's not Juliana");    break;}

当 name 为**“Juliana”**时,我们将打印一条消息,并立即中断退出该块。在switch函数内部时,直接在 case 块使用 return,就可以省略break。

当没有匹配项时,可以使用 default 选项:

const name = "Kris";switch (name) {  case "Juliana":    console.log("She's Juliana");    break;  case "Tom":    console.log("She's not Juliana");    break;  default:    console.log("Sorry, no match");}

switch在 Redux reducers 中也大量使用(尽管Redux Toolkit简化了样板),以避免产生大量的if。考虑以下示例:

const LOGIN_SUCCESS = "LOGIN_SUCCESS";const LOGIN_FAILED = "LOGIN_FAILED";const authState = {  token: "",  error: "",};function authReducer(state = authState, action) {  switch (action.type) {    case LOGIN_SUCCESS:      return { ...state, token: action.payload };    case LOGIN_FAILED:      return { ...state, error: action.payload };    default:      return state;  }}

这有什么问题吗?几乎没有。但是有没有更好的选择呢?

从 Python 获得的启示

来自 Telmo 的这条 Tweet引起了我的注意。他展示了两种“switch”风格,其中一种非常接近Python中的模式。

Python 没有开关,它给我们一个更好的替代方法。首先让我们将代码从 JavaScript 移植到Python:

LOGIN_SUCCESS = "LOGIN_SUCCESS"LOGIN_FAILED = "LOGIN_FAILED"auth_state = {"token": "", "error": ""}def auth_reducer(state=auth_state, action={}):    mapping = {        LOGIN_SUCCESS: {**state, "token": action["payload"]},        LOGIN_FAILED: {**state, "error": action["payload"]},    }    return mapping.get(action["type"], state)

在 Python 中,我们可以使用字典来模拟switch 。dict.get() 可以用来表示 switch 的 default 语句。

当访问不存在的key时,Python 会触发一个 KeyError 错误:

>>> my_dict = {    "name": "John",     "city": "Rome",     "age": 44    }>>> my_dict["not_here"]# Output: KeyError: 'not_here'

.get()方法是一种更安全方法,因为它不会引发错误,并且可以为不存在的key指定默认值:

>>> my_dict = {    "name": "John",     "city": "Rome",     "age": 44    }>>> my_dict.get("not_here", "not found")# Output: 'not found'

因此,Pytho n中的这一行:

    return mapping.get(action["type"], state)

等价于 JavaScript中的:

function authReducer(state = authState, action) {  ...    default:      return state;  ...}

使用字典的方式替换 switch

再次思考前面的示例:

const LOGIN_SUCCESS = "LOGIN_SUCCESS";const LOGIN_FAILED = "LOGIN_FAILED";const authState = {  token: "",  error: "",};function authReducer(state = authState, action) {  switch (action.type) {    case LOGIN_SUCCESS:      return { ...state, token: action.payload };    case LOGIN_FAILED:      return { ...state, error: action.payload };    default:      return state;  }}

如果不使用 switch 我们可以这样做:

function authReducer(state = authState, action) {  const mapping = {    [LOGIN_SUCCESS]: { ...state, token: action.payload },    [LOGIN_FAILED]: { ...state, error: action.payload }  };  return mapping[action.type] || state;}

这里我们使用 ES6 中的计算属性,此处,mapping的属性是根据两个常量即时计算的:LOGIN_SUCCESS 和 LOGIN_FAILED。属性对应的值,我们这里使用的是对象解构,这里 ES9((ECMAScript 2018)) 出来的。

const mapping = {  [LOGIN_SUCCESS]: { ...state, token: action.payload },  [LOGIN_FAILED]: { ...state, error: action.payload }}

你如何看待这种方法?它对 switch 来说可能还能一些限制,但对于 reducer 来说可能是一种更好的方案。

但是,此代码的性能如何?

性能怎么样?

switch 的性能优于字典的写法。我们可以使用下面的事例测试一下:

console.time("sample");for (let i = 0; i 

测量它们十次左右,

for t in {1..10}; do node switch.js >> switch.txt;donefor t in {1..10}; do node map.js >> map.txt;done
a8602352dfc893335292a2a83aa74ac9.png

作者:Valentino Gagliardi 译者:前端小智 来源:valentinog

原文:https://codeburst.io/alternative-to-javascripts-switch-statement-with-a-functional-twist-3f572787ba1c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JavaScript中的switch case语句是一种条件语句,用于根据不同的条件执行不同的代码块。它可以替代多个if语句,使代码更加简洁和易于阅读。switch case语句的语法如下: switch(expression) { case value1: // code block break; case value2: // code block break; default: // code block } 其中,expression是要比较的表达式,value1、value2等是要比较的值,case后面的代码块会在表达式等于对应的值时执行,break语句用于跳出switch语句,default语句用于在所有case都不匹配时执行。 ### 回答2: JavaScript 中的 Switch Case 语句是一种常见的控制流语句,常用于多个条件语句的处理,可以替代多个 If Else 语句。 语法结构为: ``` switch (expression) { case value1: // 当 expression 等于 value1 时执行的代码块 break; case value2: // 当 expression 等于 value2 时执行的代码块 break; ... default: // 当 expression 不等于所有 case 值时执行的代码块 break; } ``` 其中,expression 是要被匹配的表达式,而 case value 是用于比较 expression 的值。当 expression 的值等于某个 case 值时,对应的代码块会被执行。如果没有一个 case 值与 expression 值相等,则执行 default 块。同时,每个 case 块都应该以 break 语句结束,以防止执行后续的 case 代码块。 需要注意的是,在比较用于匹配的值时,JavaScript 使用了严格比较,即不仅比较类型还比较值。因此,当你使用 switch case 语句时,需要注意值和类型的匹配。 Switch Case 语句的优点在于可以让代码更加清晰、简洁,并且使用时不易出错。但也要注意在使用时要避免出现逻辑错误或代码重复,尽量保持代码的易读性和可维护性。 ### 回答3: JavaScriptswitch case语句是一种用于多重条件判断的结构,可以代替一连串的if else语句,使代码更加简洁易读。其基本语法如下: ``` switch (expression) { case value1: //执行代码块1 break; case value2: //执行代码块2 break; case value3: //执行代码块3 break; ... default: //当以上case都不匹配时执行此代码块 } ``` switch语句中的表达式(expression)通常是一个变量或表达式,每个case后面的值(value)可以是常量、变量或字面量。当表达式和某个case的值相等时,就会执行该case后面的代码块(block),直到遇到break语句switch语句结束。如果所有case都不匹配,则最后执行default代码块。 需要注意一些switch语句的特点: 1. case中的值可以是数字、字符串或布尔值等常量类型,也可以是对象、函数等引用类型,只要表达式和case的值类型相同就可以进行比较。 2. 代码块可以省略,此时相当于空语句,只有在某些情况下可以用到。 3. 如果case语句中不写break语句,那么会穿透到下一个case执行其代码块,直到遇到break或语句结尾。这种行为可以用在某些特殊情况下实现一些特定的功能。 4. 在switch语句外面定义的变量,也可以在内部的case语句使用JavaScript的作用域规则和变量声明提升机制都会有所限制。 总之,JavaScript中的switch语句可以简化复杂的条件判断逻辑,使代码更加清晰明了。但对于一些复杂的场景,还需要注意case穿透、作用域等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值