我曾多次看到
fn && fn()
是if(fn) fn()
的一种优化方式。我的问题是:为什么这样做?这两种方法所生成的代码分别是什么?fn && fn()
是if(fn) fn()
的一种优化方式。我的问题是:为什么这样做?这两种方法所生成的代码分别是什么?&&
运算符是有短路效应的,这意味着如果左侧为false
,则右侧不会被评估。因此,即使fn
为falsey(null
, undefined
等),fn && fn()
是安全的。&&
和 if
)的代码非常相似。if
语句中省略{}
)。它的缺点是对于新手来说稍微不够清晰,但它是一个很快就能学会的习惯用法。typeof fn === "function"
不是更安全吗? - Antonyif (fn) fn()
,你想确保在执行之前 fn
存在。在 JavaScript 中,if
条件检查一个布尔值或表达式,任何 falsy 值都可以在 if
布尔检查条件中变成一个 false
值。Falsy 值包括:
任何其他值都是 truthy 值。
因此,如果 fn
是一个 null
或 undefined
值,则 if
检查将保护您免于执行非函数对象。
通过 fn && fn()
,您正在执行相同的操作:在 JavaScript 中,布尔表达式是懒惰检查的,这意味着如果第一部分在 &&
操作中是 falsy 的,则第二部分将不会被执行。因此,使用此功能,您可以保护代码免于执行非函数对象。
fn && fn()
在性能方面并不是另一个版本的优化版本,但在书写方面是一个简短的版本。
这两个代码片段都需要一个前提条件:函数 fn
可能未定义或为实际函数对象。如果在您的代码中,fn
有可能是其他类型的对象,例如字符串,则需要在执行之前添加类型检查,例如:
if (fn instanceof Function) fn()