Fly*_*Cat 153 javascript if-statement
我有一个很长的条件语句,如下所示:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
Run Code Online (Sandbox Code Playgroud)
我想知道我是否可以将这个表达式/语句重构为更简洁的形式.
有关如何实现这一点的任何想法?
Yur*_*ter 242
您可以使用带有fall thru的switch语句:
switch (test.type) {
case "itema":
case "itemb":
case "itemc":
case "itemd":
// do something
}
Run Code Online (Sandbox Code Playgroud)
Jos*_*ber 240
将您的值放入数组中,并检查您的项目是否在数组中:
if ([1, 2, 3, 4].includes(test.type)) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
如果您支持的浏览器没有该Array#includes方法,则可以使用此polyfill.
~波形符快捷键的简短说明:更新:因为我们现在有了这个
includes方法,所以再也不用使用~hack了.对于那些有兴趣知道它是如何工作和/或在其他代码中遇到它的人来说,只需保留它.
而不是检查结果是否indexOf是>= 0,有一个很好的小捷径:
if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
这是小提琴:http://jsfiddle.net/HYJvK/
这是如何运作的?如果在数组中找到项,则indexOf返回其索引.如果找不到该项目,它将返回-1.没有太多的细节,这~是一个按位NOT运算符,0它只返回-1.
我喜欢使用~快捷方式,因为它比在返回值上进行比较更简洁.我希望JavaScript有一个in_array直接返回布尔值的函数(类似于PHP),但这只是一厢情愿的想法(更新:它现在可以.它被称为includes.见上文).请注意,jQuery inArray虽然共享PHP的方法签名,但实际上模仿了本机indexOf功能(如果索引是您真正想要的,那么在不同情况下这很有用).
重要提示:使用波浪形快捷方式似乎有争议,因为有些人强烈认为代码不够清晰,应该不惜一切代价避免(请参阅本答复的评论).如果你分享他们的情绪,你应该坚持.indexOf(...) >= 0解决方案.
JavaScript中的整数是有符号的,这意味着最左边的位被保留为符号位; 一个标志,指示该数字是正数还是负数,其中a 1为负数.
以下是32位二进制格式的一些样本正数:
1 : 00000000000000000000000000000001
2 : 00000000000000000000000000000010
3 : 00000000000000000000000000000011
15: 00000000000000000000000000001111
Run Code Online (Sandbox Code Playgroud)
现在这里是相同的数字,但负面:
-1 : 11111111111111111111111111111111
-2 : 11111111111111111111111111111110
-3 : 11111111111111111111111111111101
-15: 11111111111111111111111111110001
Run Code Online (Sandbox Code Playgroud)
为什么这些奇怪的组合为负数?简单.负数只是正数+ 1的倒数; 将负数加到正数应该总是屈服0.
要理解这一点,让我们做一些简单的二进制算术.
下面是我们如何将添加-1到+1:
00000000000000000000000000000001 +1
+ 11111111111111111111111111111111 -1
-------------------------------------------
= 00000000000000000000000000000000 0
Run Code Online (Sandbox Code Playgroud)
这里是我们如何将添加-15到+15:
00000000000000000000000000001111 +15
+ 11111111111111111111111111110001 -15
--------------------------------------------
= 00000000000000000000000000000000 0
Run Code Online (Sandbox Code Playgroud)
我们如何得到这些结果?通过定期添加,我们在学校教授的方式:从最右边的列开始,然后添加所有行.如果总和大于最大的单位数(以十进制表示9,但是以二进制表示1),我们将余数转移到下一列.
现在,正如您将注意到的,当向正数添加负数时,不是全部0s 的最右侧列将始终具有两个1s,当将它们加在一起时将导致2.二者的二进制表示10,我们将其1带到下一列,并将0结果放在第一列中.左边的所有其他列只有一行带有a 1,所以1从前一列继承的将再次加起来2,然后将继续...这个过程重复直到我们到达最左边的列,其中在1结转已无处可去,所以它溢出和丢失,且我们留下了0所有跨秒.
该系统称为2的补充.你可以在这里阅读更多相关信息:
既然2的补码中的速成课程结束了,你会注意到这-1是唯一一个二进制表示1全部的数字.
使用~按位NOT运算符,给定数字中的所有位都被反转.0从反转所有位回来的唯一方法是,如果我们1全都开始.
所以,这一切都是说的啰嗦的方式~n只会返回0如果n是-1.
Muh*_*mer 63
使用科学:你应该做idfah所说的和最快的速度,同时保持代码简短:
这比~方法更快
var x = test.type;
if (x == 'itema' ||
x == 'itemb' ||
x == 'itemc' ||
x == 'itemd') {
//do something
}
Run Code Online (Sandbox Code Playgroud)
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
如果出现新的东西,我会更新.
idf*_*fah 32
如果要与字符串进行比较并且存在模式,请考虑使用正则表达式.
否则,我怀疑试图缩短它只会混淆你的代码.考虑简单地包裹线条以使其漂亮.
if (test.type == 'itema' ||
test.type == 'itemb' ||
test.type == 'itemc' ||
test.type == 'itemd') {
do something.
}
Run Code Online (Sandbox Code Playgroud)
koj*_*iro 16
var possibilities = {
"itema": 1,
"itemb": 1,
"itemc": 1,
…};
if (test.type in possibilities) { … }
Run Code Online (Sandbox Code Playgroud)
使用对象作为关联数组是很常见的事情,但由于JavaScript没有本机集,因此您也可以将对象用作廉价集.
Mat*_*att 15
if( /^item[a-d]$/.test(test.type) ) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
或者如果物品不均匀,那么:
if( /^(itema|itemb|itemc|itemd)$/.test(test.type) ) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
Fra*_*oey 10
很好的答案,但你可以通过将其中一个包装在一个函数中使代码更具可读性.
如果声明很复杂,当您(或其他人)在几年内阅读代码时,您将通过扫描查找该部分以了解发生的情况.具有此级别业务逻辑的语句将导致您在计算出正在测试的内容时偶然发现几秒钟.像这样的代码,将允许您继续扫描.
if(CheckIfBusinessRuleIsTrue())
{
//Do Something
}
function CheckIfBusinessRuleIsTrue()
{
return (the best solution from previous posts here);
}
Run Code Online (Sandbox Code Playgroud)
明确命名您的函数,以便立即明确您正在测试的内容,并且您的代码将更容易扫描和理解.
| 归档时间: |
|
| 查看次数: |
19537 次 |
| 最近记录: |