我有一个很长的条件语句,如下所示:
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#includes
方法,您可以使用这个 polyfill。
~
波浪号快捷方式的简短说明:更新:既然我们现在有了这个
includes
方法,就没有必要~
再使用hack 了。只是将它保留在这里,供那些有兴趣了解它是如何工作的和/或在其他代码中遇到过它的人使用。
除了检查indexOf
is的结果之外>= 0
,还有一个不错的小捷径:
if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
// Do something
}
这是小提琴:http : //jsfiddle.net/HYJvK/
这是如何运作的?如果在数组中找到一项,则indexOf
返回其索引。如果未找到该项目,它将返回-1
。在不涉及太多细节的情况下, the~
是一个按位非运算符,它将0
仅返回for -1
。
我喜欢使用~
快捷方式,因为它比对返回值进行比较更简洁。我希望 JavaScript 有一个in_array
直接返回布尔值的函数(类似于 PHP),但这只是一厢情愿的想法(更新:现在有了。它被称为includes
。见上文)。请注意 jQuery 的inArray
,虽然共享 PHP 的方法签名,但实际上模仿了本机indexOf
功能(这在不同情况下很有用,如果索引是您真正想要的)。
重要说明:使用波浪号快捷方式似乎充满争议,因为有些人强烈认为代码不够清晰,应该不惜一切代价避免使用(请参阅对此答案的评论)。如果你同意他们的观点,你应该坚持.indexOf(...) >= 0
解决方案。
JavaScript 中的整数是有符号的,这意味着最左边的位被保留为符号位;指示数字是正数还是负数的标志,a1
为负数。
以下是一些 32 位二进制格式的示例正数:
1 : 00000000000000000000000000000001
2 : 00000000000000000000000000000010
3 : 00000000000000000000000000000011
15: 00000000000000000000000000001111
现在这里是相同的数字,但为负数:
-1 : 11111111111111111111111111111111
-2 : 11111111111111111111111111111110
-3 : 11111111111111111111111111111101
-15: 11111111111111111111111111110001
为什么负数的组合如此奇怪?简单的。负数只是正数 + 1 的倒数;将负数添加到正数应该总是 yield 0
。
为了理解这一点,让我们做一些简单的二进制算术。
以下是我们将如何添加-1
到+1
:
00000000000000000000000000000001 +1
+ 11111111111111111111111111111111 -1
-------------------------------------------
= 00000000000000000000000000000000 0
这是我们将如何添加-15
到+15
:
00000000000000000000000000001111 +15
+ 11111111111111111111111111110001 -15
--------------------------------------------
= 00000000000000000000000000000000 0
我们如何得到这些结果?通过定期加法,我们在学校教的方式:你从最右边的列开始,然后把所有的行加起来。如果总和大于最大的一位数(十进制为9
,二进制为1
),我们将余数转移到下一列。
现在,您会注意到,当将负数与正数相加时,并非全为0
s的最右侧列将始终有两个1
s,将它们加在一起将导致2
. 两个是 的二进制表示10
,我们将1
带到下一列,并将0
结果放在第一列中。左边的所有其他列只有一行带有 a 1
,因此1
从前一列结转的值将再次加起来为2
,然后结转......这个过程会不断重复,直到我们到达最左边的列,其中在1
被结转无处可去,所以它溢出和丢失,我们就只剩下0
一切都跨越。
这个系统被称为2的补码。您可以在此处阅读有关此内容的更多信息:
既然 2 的补码的速成课程已经结束,您会注意到这-1
是唯一一个二进制表示为1
's all的数字。
使用~
按位非运算符,给定数字中的所有位都被反转。0
从反转所有位回来的唯一方法是,如果我们从1
's allcross 开始。
所以,所有这些都是一种冗长的说法,~n
只有0
在n
is时才会返回-1
。
您可以使用带有 fall thru 的 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 through
和if(obj[keyval])
。
如果可能性有很多,并且其中任何一个都可能是最常发生的,换句话说,您无法知道哪一个最有可能发生,而不是从对象查找中获得最大的性能if(obj[keyval])
以及regex
是否合适。
http://jsperf.com/if-statements-test-techsin/12
如果有新东西出现,我会更新。
如果您要与字符串进行比较并且存在模式,请考虑使用正则表达式。
否则,我怀疑试图缩短它只会混淆你的代码。考虑简单地包裹线条以使其漂亮。
if (test.type == 'itema' ||
test.type == 'itemb' ||
test.type == 'itemc' ||
test.type == 'itemd') {
do something.
}
var possibilities = {
"itema": 1,
"itemb": 1,
"itemc": 1,
…};
if (test.type in possibilities) { … }
使用对象作为关联数组是很常见的事情,但由于 JavaScript 没有本地集,您也可以将对象用作廉价集。