我有一个非常长的条件语句,类似于以下内容:
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
方法,您可以使用此填充程序。
~
波浪线快捷方式的简短解释:更新:由于我们现在有了
includes
方法,所以没有必要再使用~
hack。只是为那些对它如何工作感兴趣和/或在别人的代码中遇到它的人保留这个。
与其检查indexOf
的结果是否>= 0
,有一个很好的小技巧:
if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
// Do something
}
这里有一个 JSFiddle: http://jsfiddle.net/HYJvK/
它是如何工作的?如果在数组中找到了一个元素,indexOf
会返回它的索引。如果没有找到该元素,则返回-1
。不过,不用深入细节,~
是一个按位取反运算符,只有在-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
00000000000000000000000000000001 +1
+ 11111111111111111111111111111111 -1
-------------------------------------------
= 00000000000000000000000000000000 0
以下是如何将-15
加到+15
的方法:
00000000000000000000000000001111 +15
+ 11111111111111111111111111110001 -15
--------------------------------------------
= 00000000000000000000000000000000 0
9
,但在二进制中为1
),则将余数向下一列进位。0
的最右列始终会有两个1
,将它们相加将得到2
。二的二进制表示为10
,我们将1
进位到下一列,并在第一列的结果中放置0
。左侧的所有其他列只有一个带有1
的行,因此从前一列传递过来的1
将再次相加得到2
,然后再次进位......这个过程重复进行,直到我们到达最左列,在那里要被传递的1
无处可去,所以它溢出并且消失了,我们留下横跨全列的0
。!== -1
更好吗?明确的布尔逻辑难道不是比隐式地使用零的假值更合适吗? - Phil你可以使用带有“fall thru”的switch语句:
switch (test.type) {
case "itema":
case "itemb":
case "itemc":
case "itemd":
// do something
}
||
)。请参见 http://jsperf.com/if-statements-test-techsin。 - pabouk - Ukraine stay strong运用科学:你应该按照idfah所说的方法并且使用以下这个方法,以获得最快的速度同时保持代码简洁:
这种方法比~
方法更快
var x = test.type;
if (x == 'itema' ||
x == 'itemb' ||
x == 'itemc' ||
x == 'itemd') {
//do something
}
http://jsperf.com/if-statements-test-techsin (Top set: Chrome, bottom set: Firefox)
结论:
如果可能性很少,并且你知道某些可能性比其他更容易发生,那么使用if ||
,switch fall through
和if(obj[keyval])
可以获得最大的性能。
如果可能性很多,并且任何一个可能性都可能是最常发生的,换句话说,你不知道哪一个最有可能发生,那么使用对象查找if(obj[keyval])
和regex
可以获得最佳性能。
http://jsperf.com/if-statements-test-techsin/12
如果有新内容出现,我会进行更新。
switch case
是最快的方法? - user1477388if ( ...||...||...)...
。 - Muhammad Umerobj["itemX"]
的速度非常快。基本上,速度快慢取决于上下文。祝你玩得开心。 - kojiro如果您正在比较字符串并有一个模式,请考虑使用正则表达式。
否则,我怀疑试图缩短它只会使您的代码更加晦涩难懂。考虑简单地换行来使它看起来更美观。
if (test.type == 'itema' ||
test.type == 'itemb' ||
test.type == 'itemc' ||
test.type == 'itemd') {
do something.
}
(test.type == 'itemf' && foo.mode == 'detailed')
)。 - Izkatavar possibilities = {
"itema": 1,
"itemb": 1,
"itemc": 1,
…};
if (test.type in possibilities) { … }
在JavaScript中,使用对象作为关联数组是一种很常见的方式。但由于JavaScript没有原生的集合数据结构,因此你也可以将对象用作简单的集合。
if
语句条件如果删除所有空白字符,则需要78个字符。如果像这样编写:test.type in {"itema":1,"itemb":1,"itemc":1,"itemd":1}
,则我的条件只需要54个字符。从根本上讲,他的条件每增加两个键就需要四个字符,而我的条件只需要两个字符。 - kojiroif( /^item[a-d]$/.test(test.type) ) { /* do something */ }
或者,如果物品不是那么统一,那么:
if( /^(itema|itemb|itemc|itemd)$/.test(test.type) ) { /* do something */ }
回答很好,但是您可以通过将其中一个包装在一个函数中使代码更易读。
这是一条复杂的if语句,当您(或其他人)在一年后阅读代码时,您将浏览以找到部分来理解正在发生的事情。具有此业务逻辑水平的语句将导致您在工作时绊倒几秒钟,而像这样的代码将使您能够继续扫描。
if(CheckIfBusinessRuleIsTrue())
{
//Do Something
}
function CheckIfBusinessRuleIsTrue()
{
return (the best solution from previous posts here);
}
明确命名函数,使其立即显而易见你正在测试什么,这样你的代码将更容易扫描和理解。
// 检查业务规则是否为真
,怎么样? - daniel1426.contains()
即可。var itemSet = new Set(["itema","itemb","itemc","itemd"]);
if( itemSet.contains( test.type ){}
使用switch
语句代替if
语句:
switch (test.type) {
case "itema":case "itemb":case "itemc":case "itemd":
// do your process
case "other cases":...:
// do other processes
default:
// do processes when test.type does not meet your predictions.
}
Switch
语句比在 if
中使用大量条件语句更快。
function isTypeDefined(test) {
return test.type == 'itema' ||
test.type == 'itemb' ||
test.type == 'itemc' ||
test.type == 'itemd';
}
…
if (isTypeDefined(test)) {
…
}
...
in
吗? - jeremy||
. (2)switch
语句. (3) 正则表达式. (4)~
. http://jsperf.com/if-statements-test-techsin - Muhammad Umer