“if(fn)fn()”或“fn&& fn()”

时间:2013-03-30 16:32:01

标签: javascript

我已经多次看到fn && fn()if (fn) fn()的优化。

我的问题是:为什么?并且,两种解决方案的生成代码是什么?

3 个答案:

答案 0 :(得分:13)

JavaScript中的&&运算符短路,这意味着如果左侧是false,则根本不评估右侧。这就是fn && fn()即使fn为假(nullundefined等)也是安全的原因。

“生成的代码”将完全取决于JavaScript引擎,但我希望它在两种情况下都非常相似(&&if)。

从运行速度的角度来看,这不是“优化”,而是在写作时更短(特别是如果像我一样,你从不离开{} if陈述)。对于那些不熟悉该语言的人来说,它的缺点是略微,但这是一个很快学会的习语。

答案 1 :(得分:2)

因此,在if (fn) fn()之前,您需要确保fn在执行之前已存在。 if条件检查布尔值或表达式,在JavaScript中,任何falsy值都可以转换为false布尔检查条件中的if值。假值可能是:

  • 未定义
  • 空字符串''
  • 数字0
  • 数字NaN(是的,'非数字'是一个数字,它是一个特殊的 数)

任何其他价值都是真正的价值。

因此,如果fnnullundefined值,if检查将保护您免于执行非功能对象。

通过fn && fn(),您正在做同样的事情:在JavaScript中,布尔表达式是惰性检查的,这意味着如果&&操作中的第一部分是假的,那么第二部分将不会被执行。因此,使用此功能,您可以保护代码不会执行非功能对象。

fn && fn()在性能方面不是另一个的优化版本,但是是书面的简短版本。

两个代码段都需要一个前提条件:函数fn可以是未定义的,也可以是实际的函数对象。如果在代码中,fn有可能成为其他类型的对象,例如字符串,则需要在执行前添加类型检查,例如:

if (fn instanceof Function) fn()

答案 2 :(得分:0)

在优化方面,恕我直言,我会说它是因为它是一种更好的方法,如果那时使它成为一条线,而不必牺牲括号和损害可读性,但它不会使代码执行得更快