如何缩短我的条件语句

2022-08-30 02:40:43

我有一个很长的条件语句,如下所示:

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

我想知道我是否可以将此表达式/语句重构为更简洁的形式。

关于如何实现这一目标的任何想法?


答案 1

将值放入数组中,然后检查您的项目是否在数组中:

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

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


波浪号快捷方式的简短说明:~

更新:由于我们现在有了该方法,因此不再使用hack了。只是把这个留给那些有兴趣了解它是如何工作的和/或在其他人的代码中遇到过它的人。includes~

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

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

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

这是如何工作的?如果在数组中找到某个项,则返回其索引。如果未找到该项目,它将返回 。在不涉及太多细节的情况下,是一个按位的 NOT 运算符,它将仅返回 。indexOf-1~0-1

我喜欢使用快捷方式,因为它比对返回值进行比较更简洁。我希望JavaScript有一个直接返回布尔值的函数(类似于PHP),但这只是一厢情愿的想法(更新:它现在确实如此。它被称为.见上文)。请注意,jQuery的,虽然共享PHP的方法签名,但实际上模仿了本机功能(这在不同情况下很有用,如果索引是你真正想要的)。~in_arrayincludesinArrayindexOf

重要提示:使用波浪号快捷方式似乎引起了争议,因为有些人强烈认为代码不够清晰,应该不惜一切代价避免(请参阅对此答案的评论)。如果你分享他们的观点,你应该坚持解决方案。.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

我们如何获得这些结果?通过定期加法,就像我们在学校里教的那样:你从最右边的列开始,你把所有的行加起来。如果总和大于最大的个位数(在十进制中是 ,但在二进制中是),我们将余数带到下一列。91

现在,正如您会注意到的,当将负数添加到其正数时,最右边的列(不是所有s)将始终有两个s,当它们加在一起时将导致.二的二进制表示形式是 ,我们将 带到下一列,并在第一列中放置一个结果。左边的所有其他列只有一行带有 a ,因此从前一列继承的将再次加起来 ,然后将继续...这个过程会重复自己,直到我们到达最左边的列,在那里要传递的无处可去,所以它溢出并丢失,我们留下了所有的东西。012101011210

这个系统被称为2的补码。您可以在此处阅读更多相关信息:

有符号整数的 2 补码表示


现在 2 补码中的速成课程已经结束,您会注意到这是唯一一个二进制表示为 all across 的数字。-11

使用按位 NOT 运算符,给定数字中的所有位都是反转的。从反转所有位中恢复过来的唯一方法是,如果我们从 ' all 开始。~01

因此,所有这些都是一种冗长的说法,只有当是时才会返回。~n0n-1


答案 2

您可以将 switch 语句与 fall thru 一起使用:

switch (test.type) {

  case "itema":
  case "itemb":
  case "itemc":
  case "itemd":
    // do something
}