如何缩短我的条件陈述

这个问题在这里已经有了答案:

  • Javascript格式为if条件[复制] 6个答案

  • 把你的值放入数组中,并检查你的项目是否在数组中:

    if ([1, 2, 3, 4].includes(test.type)) {
        // Do something
    }
    

    如果您支持的浏览器没有Array#includes方法,则可以使用此polyfill。


    在简要解释~波浪号快捷方式:

    更新:由于我们现在有includes方法,还有在使用不点~砍了。 只要将这一点留给那些有兴趣知道它是如何工作和/或在其他代码中遇到过的人。

    而不是检查indexOf的结果是否>= 0 ,有一个很好的小捷径:

    if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
        // Do something
    }
    

    这是小提琴:http://jsfiddle.net/HYJvK/

    这个怎么用? 如果在数组中找到一个项目, indexOf返回它的索引。 如果找不到该项目,它将返回-1 。 没有深入细节, ~是一个按位NOT运算符,它只会为-1返回0

    我喜欢使用~捷径,因为它比返回值做比较更简洁。 我希望JavaScript会有一个in_array函数直接返回一个布尔类型(类似于PHP),但这只是一厢情愿的想法( 更新:它现在做,它被称为includes ,见上文)。 请注意,jQuery的inArray在共享PHP的方法签名时,实际上模仿了本地的indexOf功能(如果索引是真正的,那么在不同的情况下这很有用)。

    重要提示:使用代字号快捷键似乎有争议,因为有些人强烈地认为代码不够清晰,应该不惜一切代价予以避免(请参阅对此答案的评论)。 如果你分享他们的观点,你应该坚持.indexOf(...) >= 0解决方案。


    稍微解释一下:

    JavaScript中的整数是带符号的,这意味着最左边的位被保留为符号位; 表示数字是正数还是负数的标志, 1表示负数。

    以下是一些32位二进制格式的正数:

    1 :    00000000000000000000000000000001
    2 :    00000000000000000000000000000010
    3 :    00000000000000000000000000000011
    15:    00000000000000000000000000001111
    

    现在这里是相同的数字,但是是负数:

    -1 :   11111111111111111111111111111111
    -2 :   11111111111111111111111111111110
    -3 :   11111111111111111111111111111101
    -15:   11111111111111111111111111110001
    

    为什么这种负数的奇怪组合? 简单。 负数只是正数+ 1的倒数; 将负数加到正数应始终为0

    为了理解这一点,我们来做一些简单的二进制算术。

    下面是我们如何将增加-1+1

       00000000000000000000000000000001      +1
    +  11111111111111111111111111111111      -1
    -------------------------------------------
    =  00000000000000000000000000000000       0
    

    这里是我们将如何添加-15+15

       00000000000000000000000000001111      +15
    +  11111111111111111111111111110001      -15
    --------------------------------------------
    =  00000000000000000000000000000000        0
    

    我们如何获得这些结果? 通过定期补充,我们在学校教授的方式:从最右侧的列开始,并将所有行加起来。 如果总和大于最大的一位数字(十进制数字是9 ,但二进制数字是1 ),我们将剩余的数字转移到下一列。

    现在,正如你会注意到的那样,当给它的正数添加一个负数时,最右边不是0的列总是有两个1 s,当它们加在一起时会得到2 。 两个是的二进制表示10 ,我们进行了1到下一列,并把一个0的结果中的第一列。 左边的所有其他列只有一行有1 ,因此从前一列继承的1将再次加起来为2 ,然后继续...此过程重复,直到我们到达最左侧在那里, 1被遗弃的地方无处可去,所以它溢出并迷路了,我们剩下0秒。

    这个系统被称为2的补码 。 你可以在这里阅读更多关于这个:

    2的有符号整数的补码表示


    现在2的补充速成课程已经结束,您会注意到-1是唯一一个二进制表示形式为1的数字。

    使用~按位NOT运算符,给定数字中的所有位都被反转。 如果我们从1开始,所有比特都反转回0的唯一方法。

    所以,这一切都是说的一口长气路~n只会返回0 ,如果n-1


    你可以使用switch语句,通过下降:

    switch (test.type) {
    
      case "itema":
      case "itemb":
      case "itemc":
      case "itemd":
        // do something
    }
    

    使用科学:你应该做什么idfah说和这个以最快的速度,同时保持代码简短:

    这是比速度更快~方法

    var x = test.type;
    if (x == 'itema' ||
        x == 'itemb' ||
        x == 'itemc' ||
        x == 'itemd') {
        //do something
    }
    

    http://jsperf.com/if-statements-test-techsin 在这里输入图像描述 (上限:Chrome,下限:Firefox)

    结论:

    如果可能性很小,并且您知道某些特定事件发生的可能性比您获得最高性能时更可能发生if ||switch fall throughif(obj[keyval])

    如果可能性很多 ,并且其中任何一个都可能是最常发生的,换句话说, if(obj[keyval])regex如果这适合。

    http://jsperf.com/if-statements-test-techsin/12

    如果有新的东西出现,我会更新。

    链接地址: http://www.djcxy.com/p/74967.html

    上一篇: How to shorten my conditional statements

    下一篇: JQuery: What does this code mean?