我已经多次看到fn && fn()
是if (fn) fn()
的优化。
我的问题是:为什么?并且,两种解决方案的生成代码是什么?
答案 0 :(得分:13)
JavaScript中的&&
运算符短路,这意味着如果左侧是false
,则根本不评估右侧。这就是fn && fn()
即使fn
为假(null
,undefined
等)也是安全的原因。
“生成的代码”将完全取决于JavaScript引擎,但我希望它在两种情况下都非常相似(&&
和if
)。
从运行速度的角度来看,这不是“优化”,而是在写作时更短(特别是如果像我一样,你从不离开{}
if
陈述)。对于那些不熟悉该语言的人来说,它的缺点是略微,但这是一个很快学会的习语。
答案 1 :(得分:2)
因此,在if (fn) fn()
之前,您需要确保fn
在执行之前已存在。 if
条件检查布尔值或表达式,在JavaScript中,任何falsy值都可以转换为false
布尔检查条件中的if
值。假值可能是:
任何其他价值都是真正的价值。
因此,如果fn
是null
或undefined
值,if
检查将保护您免于执行非功能对象。
通过fn && fn()
,您正在做同样的事情:在JavaScript中,布尔表达式是惰性检查的,这意味着如果&&
操作中的第一部分是假的,那么第二部分将不会被执行。因此,使用此功能,您可以保护代码不会执行非功能对象。
fn && fn()
在性能方面不是另一个的优化版本,但是是书面的简短版本。
两个代码段都需要一个前提条件:函数fn
可以是未定义的,也可以是实际的函数对象。如果在代码中,fn
有可能成为其他类型的对象,例如字符串,则需要在执行前添加类型检查,例如:
if (fn instanceof Function) fn()
答案 2 :(得分:0)
在优化方面,恕我直言,我会说它是因为它是一种更好的方法,如果那时使它成为一条线,而不必牺牲括号和损害可读性,但它不会使代码执行得更快