"if (fn) fn()" or "fn && fn()"
"if (fn) fn()" or "fn && fn()"
我多次看到fn && fn()
是对if (fn) fn()
的优化。
我的问题是:为什么?以及,为这两个解决方案生成的代码是什么?
JavaScript中的&&
运算符是短路,这意味着如果左侧是false
,则根本不计算右侧。这就是为什么即使fn
是假的(null
、undefined
等(,fn && fn()
也是安全的
"生成的代码"将完全取决于JavaScript引擎,但我希望它在两种情况下(&&
和if
(都非常相似。
这不是运行速度更快的"优化",而是写得更短(尤其是如果像我一样,您从未将{}
从if
语句中删除(。它的缺点是,对于刚接触该语言的人来说,稍微不太清楚,但它是一个很快学会的成语。
因此,通过if (fn) fn()
,您需要在执行它之前确保fn
存在。if
条件检查布尔值或表达式,在JavaScript中,任何错误的值都可能在if
布尔检查条件中变成false
值。错误的值可能是:
- 虚假的
- null
- 未定义的
- 空字符串">
- 数字0
- 数字NaN(是的,"不是数字"是一个数字,它是一个特殊的数字数字(
任何其他价值都是真实的价值。
因此,如果fn
是null
或undefined
值,则if
检查将保护您不执行非函数对象。
对于fn && fn()
,您也在做同样的事情:在JavaScript中,布尔表达式是惰性检查的,这意味着如果&&
操作中的第一部分是错误的,那么第二部分将不会执行。因此,有了这个特性,就可以保护代码不执行非函数对象。
fn && fn()
在性能方面不是另一个的优化版本,而是一个简短的书面版本。
这两个代码段都需要一个先决条件:函数fn
可以是未定义的,也可以是实际的函数对象。如果在您的代码中,fn
有可能是其他类型的对象,例如字符串,则在执行之前需要添加类型检查,例如:
if (fn instanceof Function) fn()
就优化而言,IMHO,我会说它是因为它是一种更好的方法,可以使它成为一行,而不必牺牲大括号和损害可读性,但它不会使代码执行得更快。
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- 为什么<车身负载=“;fn()">使用函数调用,但是window.onload=fn;使用处理程序函
- "原型;在jQuery fn?+中jquery函数中的纯javascript代码