关于 js 中使用 switch (true) 和 if else - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Flands
V2EX    程序员

关于 js 中使用 switch (true) 和 if else

  •  1
     
  •   Flands 2020-12-22 10:18:18 +08:00 3964 次点击
    这是一个创建于 1754 天前的主题,其中的信息可能已经有所发展或是发生改变。
    switch (true) { case this.status === 0 && data.type === 1: case (this.status === 2 || this.status === 3) && data.status === 2: this.nextBtnIsOk = true break; default: break; } if ( (this.status === 0 && data.type === 1) || ((this.status === 2 || this.status === 3) && data.status === 2) ) { this.nextBtnIsOk = true; } 

    投个票,大家习惯写哪种格式?两种都可以,看团队代码风格。
    主要是 if else 的括号太多,看着有点累,哈哈。。

    38 条回复    2021-03-14 23:43:14 +08:00
    islxyqwe
        1
    islxyqwe  
       2020-12-22 10:23:59 +08:00 via Android
    this.nextBtnIsOk = (this.status === 0 && data.type === 1) ||
    ((this.status === 2 || this.status === 3) && data.status === 2)
    Flands
        2
    Flands  
    OP
       2020-12-22 10:29:43 +08:00
    @islxyqwe 还在开发的功能,有可能有其他判断和逻辑,不一定只有 `this.nextBtnIsOk = true` 这一行
    Flands
        3
    Flands  
    OP
       2020-12-22 10:31:20 +08:00
    这里只讨论这两种风格,不要在意逻辑~
    3dwelcome
        4
    3dwelcome  
       2020-12-22 10:32:24 +08:00   4
    我还是第一次看到 switch 还能有这种用法,果然 JS 是万能的,涨姿势。
    3dwelcome
        5
    3dwelcome  
       2020-12-22 10:35:59 +08:00
    就个人而言,我喜欢写 early return,就是 nextBtnIsOk = true 后就直接一句 return, 也没多余判断。
    可能子函数会多一点点,但流程比较容易看懂,也没有那么多括号和 else 。
    Bijiabo
        6
    Bijiabo  
       2020-12-22 10:45:32 +08:00 via iPhone
    我倾向写 switch(rue)
    BreadKiller
        7
    BreadKiller  
       2020-12-22 10:48:56 +08:00   2
    我也是第一次看到 switch 这种写法。
    就可读性来说 switch 这种写法确实比下面这种一大串的括号好看。

    但是我一般遇到这种很多条件的情况都会把各种条件分别定义:
    let a = this.status === 0 && data.type === 1;
    let b = (this.status === 2 || this.status === 3) && data.status === 2;
    if (a || b) {
    this.nextBtnIsOk = true;
    }
    faceRollingKB
        8
    faceRollingKB  
       2020-12-22 11:23:05 +08:00
    我的写法一般是 if + return

    if(this.status === 0 && data.type === 1){
    return;
    }
    if((this.status === 2 || this.status === 3) && data.status === 2){
    this.nextBtnIsOk = true
    return;
    }
    ...
    enjoyCoding
        9
    enjoyCoding  
       2020-12-22 11:23:52 +08:00   2
    if (condition1) {
    ...
    return
    }
    if (condition2) {
    ...
    return
    }
    对于 condition 比较长的
    const isCOndition= () => {}
    if (isCondition()) {}
    faceRollingKB
        10
    faceRollingKB  
       2020-12-22 11:24:30 +08:00
    相对于其他写法我觉得要更灵活
    EscYezi
        11
    EscYezi  
       2020-12-22 11:44:44 +08:00 via iPhone
    如果是这两种的话选第一种,有时也用#9 的方式
    wednesdayco
        12
    wednesdayco  
       2020-12-22 11:45:07 +08:00
    为了方便扩展和理解我大概会这么写
    cOndition= {conditionName0:[0,1],conditionName1:[[2,3],2]};

    const getCOnditionResult= (cdt)=>{
    const cdt0=Array.isArray(cdt[0])?cdt[0].includes(this.status):cdt[0]===this.status;
    const cdt1=Array.isArray(cdt[1])?cdt[1].includes(data.status):cdt[1]===data.status;
    return cdt0&&cdt1;
    }

    if(getConditionResult(condition.conditionName0)||getConditionResult(condition.conditionName1)){
    return xxx=true;
    }
    Chemist
        13
    Chemist  
       2020-12-22 11:49:05 +08:00 via iPhone   3
    condition 很长的话应该把他写成函数,而不是搞这种取巧。
    abelmakihara
        14
    abelmakihara  
       2020-12-22 11:50:47 +08:00
    要么就极简 直接 this.nextBtnIsOk = (this.status === 0 && data.type === 1) || ((this.status === 2 || this.status === 3) && data.status === 2)
    特别复杂就两遍 switch 好了
    根据不同 type 做不同处理
    abelmakihara
        15
    abelmakihara  
       2020-12-22 11:51:55 +08:00
    switch(type){
    case 1: xxx();break;
    case 2: xxx2();break;
    huichao
        16
    huichao  
       2020-12-22 11:54:41 +08:00
    switch. 喜欢 switch 的写法,性能比 if else 高。
    solobat
        17
    solobat  
       2020-12-22 11:57:54 +08:00
    break 挺丑的
    AoEiuV020
        18
    AoEiuV020  
       2020-12-22 12:03:12 +08:00
    后者,
    switch 这样写太丑了,
    heyzoo
        19
    heyzoo  
       2020-12-22 12:13:02 +08:00 via Android
    这让我想起了 switch case 正则判断。我更倾向于 switch
    Biwood
        20
    Biwood  
       2020-12-22 12:54:00 +08:00
    看到过这种写法,但是我个人一直都没这么写过,代码毕竟是写给人看的,么直观怎么来。如果条件语句太长,要么换行,格式化代码,要么封装成函数。
    love
        21
    love  
       2020-12-22 12:58:54 +08:00
    这种 switch 写法是什么鬼?从来没见过,而且感觉很容易出错。

    switch (true) { case true: console.log("FUCK"); }
    这的确可以


    switch (true) { case 1: console.log("FUCK"); }
    这就不行了吧,你得确保条件都返回 true 别的 true 值都不行,这太容易出错了,比如一个函数返回值你不能确定就是 true,你得用 case Boolean(isSomething())包一层
    weixiangzhe
        22
    weixiangzhe  
       2020-12-22 13:00:34 +08:00
    还能这样玩啊,涨见识了,话说这个 do-expression 也挺好的
    https://babeljs.io/docs/en/babel-plugin-proposal-do-expressions
    dartabe
        23
    dartabe  
       2020-12-22 13:01:43 +08:00
    楼上的 if + early return 比较好

    反正我感觉只有 if 没有 else 的代码比较好读
    zmNv0
        24
    zmNv0  
       2020-12-22 14:03:13 +08:00
    若单变量,使用 switch
    若多变量,使用 if return
    xingchong
        25
    xingchong  
       2020-12-22 14:17:23 +08:00
    js 成天被喷简单,是个人都会用,看楼上回复竟然这么多第一次见到 switch ???
    都是后端程序猿吗?
    用哪种方式,主要看业务逻辑,比如判断订单状态,每个状态对应一种逻辑的话,switch 很直观,最后再加一个 default,这种用 ifelse 就看着有点嗦。
    GuuJiang
        26
    GuuJiang  
       2020-12-22 14:20:30 +08:00 via iPhone
    @xingchong 这是我见过后端被黑的最惨的一次,楼上说的不是第一次见 switch,而是第一次见 switch(true)
    xingchong
        27
    xingchong  
       2020-12-22 14:28:11 +08:00
    @GuuJiang soga,我说呢,看错了,哈哈哈
    chenyu0532
        28
    chenyu0532  
       2020-12-22 14:53:47 +08:00
    我绝大多数情况下使用 if else,莫名的看 swtich 不顺眼
    leeton
        29
    leeton  
       2020-12-22 14:56:26 +08:00
    居然能用 switch 。
    Lemeng
        30
    Lemeng  
       2020-12-22 15:01:30 +08:00
    喜欢 if
    AV1
        31
    AV1  
       2020-12-22 15:54:41 +08:00
    不喜欢 switch-case 的可以直接用 label 语句,

    let nextBtnIsOk = true
    label:{
    if(this.status === 0 && data.type === 1) break label;
    if((this.status === 2 || this.status === 3) && data.status === 2) break label;
    nextBtnIsOk = false;
    }
    this.nextBtnIsOk = nextBtnIsOk;
    forgottencoast
        32
    forgottencoast  
       2020-12-22 15:56:00 +08:00
    考虑代码可读性,if 。
    acmore
        33
    acmore  
       2020-12-22 16:06:00 +08:00
    如果 If 语句都要写成下边这种形式我选 Switch,读起来太累,然而你不必非要这么写 If 语句,7 楼的写法就舒服很多了。
    AV1
        34
    AV1  
       2020-12-22 16:27:59 +08:00
    @BreadKiller
    你的这写法会导致每次执行都要计算每个条件的值。改进一下可以使得前面的条件满足后不再计算后面的条件值。

    let willSet;
    willSet = willSet || this.status === 0 && data.type === 1;
    willSet = willSet || (this.status === 2 || this.status === 3) && data.status === 2;
    willSet = willSet || xxxxx;
    willSet = willSet || yyyyy;
    willSet = willSet || zzzzz;
    // ...

    if (willSet) {
    this.nextBtnIsOk = true;
    }
    Reapper
        35
    Reapper  
       2020-12-22 16:29:25 +08:00
    if + return
    ciddechan
        36
    ciddechan  
       2020-12-23 09:06:52 +08:00
    let a = '3';
    switch (a) {
    case 3:
    console.log(false)
    break;
    case '3':
    console.log(true)
    break;
    }

    console.log(a==3)
    console.log(a=='3')
    console.log(a===3)
    console.log(a==='3')

    switch 约等于 ===
    jifengg
        37
    jifengg  
       2020-12-23 13:53:46 +08:00
    也是第一次知道 switch 还能这么玩。
    cnelf
        38
    cnelf  
       2021-03-14 23:43:14 +08:00
    switch 的可读性确实要强一些,但是感觉不太符合 switch 在设计上的语义。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     928 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 19:13 PVG 03:13 LAX 12:13 JFK 15:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86