首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"if (fn) fn()“或"fn && fn()”

"if (fn) fn()“或"fn && fn()”
EN

Stack Overflow用户
提问于 2013-03-31 00:32:01
回答 3查看 977关注 0票数 7

我见过很多次fn && fn()是对if (fn) fn()的优化。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-31 00:35:37

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

“生成的代码”将完全依赖于JavaScript引擎,但我希望这两种情况( &&if)都非常相似。

这不是在运行更快的意义上的“优化”,而是在编写更短的代码方面(特别是如果像我一样,您从不将{}if语句中删除)。它的缺点是对于刚接触这门语言的人来说不太清楚,但这是一个很快就会学会的习惯用法。

票数 14
EN

Stack Overflow用户

发布于 2013-03-31 00:34:06

因此,通过if (fn) fn(),您希望在执行fn之前确保它已经存在。if条件检查布尔值或表达式,在JavaScript中,在if布尔检查条件中,任何False值都可以转换为false值。Falsy值可能是:

空字符串‘’

  • number 0

  • number NaN (是的,'Not a Number‘是一个数字,它是一个特殊的数字)

任何其他值都将是真值。

因此,如果fnnullundefined值,那么if检查将防止您执行非函数对象。

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

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

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

if (fn instanceof Function) fn()

票数 2
EN

Stack Overflow用户

发布于 2013-03-31 00:37:26

在优化方面,IMHO,我之所以这么说,是因为这是一种更好的方式,如果这样做的话,它就只有一行,而不必牺牲大括号和牺牲可读性,但它不会让代码执行得更快

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15720840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档