2013-05-07 114 views
-3

这个我可以简化或获得性能,这是声明如何if语句

if(validator(foo) && foo.var1 || foo.var2 || foo.var3 || foo.var4){ 
    //do sometihng 
}else{ 
    //do anything because if foo.* doesnt exists i cant do anything 
} 

的声明说:验证需要有效FOO,并返回true,并VAR1或VAR2 VAR3或VAR4必须存在。

如果有人需要解释,只需添加评论。这是一个简单的问题,但我试图在我的代码中获得性能。顺便说一下,有任何书籍或教程,有关于JavaScript中的性能代码的一些信息。

谢谢大家!

+1

您是否知道此代码很慢? – 2013-05-07 00:35:41

+0

在这一点上过时了,但这确实奠定了一个良好的基础:http://www.amazon.com/Performance-JavaScript-Faster-Application-Interfaces/dp/059680279X – 2013-05-07 00:37:25

回答

4

如果validator(foo)是一个昂贵的操作,你可以扭转测试的顺序:

if ((foo.var1 || foo.var2 || foo.var3 || foo.var4) && validator(foo)) { 
} else { 
} 

如果validator(foo)也不是特别贵,有可能是没有理由花费任何时候都想着如何改善这一小段代码的性能。你的时间有更好的用途。

顺便说一句,这段代码是基于你的口头描述。你的代码与口头描述不兼容,可能是越野车。在JavaScript中,false && false || true评估为true。你可能需要

if(validator(foo) && (foo.var1 || foo.var2 || foo.var3 || foo.var4)) { 

此外,本杰明指出,foo.var1不会测试foo.var1存在;它会检查它是否存在(在foo或其原型链中),而且不是“falsy”值。 (例如,如果foo.var1为0,则它​​将评估为false。)您可能正在寻找foo.hasOwnProperty('var1')等。

+0

此外,'foo.var1'和它的所有朋友都不检查物体上是否存在财产。他们检查是否在原型链的某个地方拥有所有这些属性,并且他们都不是虚假的。 – 2013-05-07 00:37:34

+0

@BenjaminGruenbaum - 好点。很难确切知道OP用这个代码试图完成什么。 – 2013-05-07 00:43:09

+0

好吧,可能没有一个完整的问题,和一个硬性desription ...但你的答案解决了我的问题TNX! – andrescabana86 2013-05-07 01:05:16