"if (fn) fn()" or "fn && fn()"

"if (fn) fn()" or "fn && fn()"

本文关键字:fn quot amp or if      更新时间:2023-09-26

我多次看到fn && fn()是对if (fn) fn()的优化。

我的问题是:为什么?以及,为这两个解决方案生成的代码是什么?

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

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

这不是运行速度更快的"优化",而是写得更短(尤其是如果像我一样,您从未将{}if语句中删除(。它的缺点是,对于刚接触该语言的人来说,稍微不太清楚,但它是一个很快学会的成语。

因此,通过if (fn) fn(),您需要在执行它之前确保fn存在。if条件检查布尔值或表达式,在JavaScript中,任何错误的值都可能在if布尔检查条件中变成false值。错误的值可能是:

  • 虚假的
  • null
  • 未定义的
  • 空字符串">
  • 数字0
  • 数字NaN(是的,"不是数字"是一个数字,它是一个特殊的数字数字(

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

因此,如果fnnullundefined值,则if检查将保护您不执行非函数对象。

对于fn && fn(),您也在做同样的事情:在JavaScript中,布尔表达式是惰性检查的,这意味着如果&&操作中的第一部分是错误的,那么第二部分将不会执行。因此,有了这个特性,就可以保护代码不执行非函数对象。

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

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

if (fn instanceof Function) fn()

就优化而言,IMHO,我会说它是因为它是一种更好的方法,可以使它成为一行,而不必牺牲大括号和损害可读性,但它不会使代码执行得更快。