如何缩短我的条件语句
我有一个很长的条件语句,如下所示:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
我想知道我是否可以将此表达式/语句重构为更简洁的形式。
关于如何实现这一目标的任何想法?
我有一个很长的条件语句,如下所示:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
我想知道我是否可以将此表达式/语句重构为更简洁的形式。
关于如何实现这一目标的任何想法?
将值放入数组中,然后检查您的项目是否在数组中:
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_array
includes
inArray
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
现在,正如您会注意到的,当将负数添加到其正数时,最右边的列(不是所有s)将始终有两个s,当它们加在一起时将导致.二的二进制表示形式是 ,我们将 带到下一列,并在第一列中放置一个结果。左边的所有其他列只有一行带有 a ,因此从前一列继承的将再次加起来 ,然后将继续...这个过程会重复自己,直到我们到达最左边的列,在那里要传递的无处可去,所以它溢出并丢失,我们留下了所有的东西。0
1
2
10
1
0
1
1
2
1
0
这个系统被称为2的补码。您可以在此处阅读更多相关信息:
现在 2 补码中的速成课程已经结束,您会注意到这是唯一一个二进制表示为 all across 的数字。-1
1
使用按位 NOT 运算符,给定数字中的所有位都是反转的。从反转所有位中恢复过来的唯一方法是,如果我们从 ' all 开始。~
0
1
因此,所有这些都是一种冗长的说法,只有当是时才会返回。~n
0
n
-1
您可以将 switch 语句与 fall thru 一起使用:
switch (test.type) {
case "itema":
case "itemb":
case "itemc":
case "itemd":
// do something
}