我见过很多次fn && fn()是对if (fn) fn()的优化。
我的问题是:为什么?那么,这两种解决方案的生成代码是什么?
发布于 2013-03-31 00:35:37
JavaScript中的&&运算符是短路的,这意味着如果左侧为false,则根本不计算右侧。这就是为什么即使fn是假的(null、undefined等),fn && fn()也是安全的。
“生成的代码”将完全依赖于JavaScript引擎,但我希望这两种情况( &&和if)都非常相似。
这不是在运行更快的意义上的“优化”,而是在编写更短的代码方面(特别是如果像我一样,您从不将{}从if语句中删除)。它的缺点是对于刚接触这门语言的人来说不太清楚,但这是一个很快就会学会的习惯用法。
发布于 2013-03-31 00:34:06
因此,通过if (fn) fn(),您希望在执行fn之前确保它已经存在。if条件检查布尔值或表达式,在JavaScript中,在if布尔检查条件中,任何False值都可以转换为false值。Falsy值可能是:
空字符串‘’
任何其他值都将是真值。
因此,如果fn是null或undefined值,那么if检查将防止您执行非函数对象。
对于fn && fn(),您正在做同样的事情:在JavaScript中,布尔表达式是延迟检查的,这意味着如果&&操作中的第一部分是假的,那么第二部分将不会被执行。因此,有了这个特性,你就可以保护你的代码不被执行非函数对象。
就性能而言,fn && fn()不是另一个的优化版本,而是一个简短的书面版本。
这两个代码片段都需要一个前提条件:函数fn可以是未定义的,也可以是实际的函数对象。如果在您的代码中,fn有可能是其他类型的对象,例如字符串,则需要在执行前添加类型检查,例如:
if (fn instanceof Function) fn()
发布于 2013-03-31 00:37:26
在优化方面,IMHO,我之所以这么说,是因为这是一种更好的方式,如果这样做的话,它就只有一行,而不必牺牲大括号和牺牲可读性,但它不会让代码执行得更快
https://stackoverflow.com/questions/15720840
复制相似问题