在 JS 中存在 "fn && fn() " 执行语句 这个语句有什么意义吗?

2020-06-23 11:53:46 +08:00
 VWMMWV

我在看别人代码的时候,有看到代码是这样写的

function(){
  fn&&fn()
}

大概意思是这么个意思,但是这我感觉这样写好像没意义,有带佬能指点一下吗

8696 次点击
所在节点    JavaScript
92 条回复
Vogan
2020-06-23 13:03:51 +08:00
@dremy 你那是 jsx 。在调用 props 的函数的时候,很正常。this.props.cb && this.props.cb()
taxiaohaohhh
2020-06-23 13:04:43 +08:00
@dremy 负分哪里得出的,还有这个写法怎么装逼的
xiangyuecn
2020-06-23 13:06:41 +08:00
很多古董语言开始没有简写的 null 判断,一堆 if else,非常难看,后面陆续都有了可空类型,普遍简写成一句话,类似:nullObj?.call(),还是 js 的语义上更直白 obj&&obj.call()
Vegetable
2020-06-23 13:06:43 +08:00
就是一个 or 运算符,前者为 true,再判断后者,否则就直接 false 。
其实不推荐这种写法,本身这个写法其实很易懂了,楼主还是没直接理解。
这种东西拜托不要写在业务代码里。
dremy
2020-06-23 13:08:41 +08:00
@Vogan
@taxiaohaohhh

https://eslint.org/docs/rules/no-unused-expressions
Expected an assignment or function call and instead saw an expression.
nianyu
2020-06-23 13:15:18 +08:00
如果存在 fn 就执行 fn, 正常业务代码这么写的比较少
xiangyuecn
2020-06-23 13:18:31 +08:00
@nianyu 就算你不手写,打包后人家自动帮你改成这个格式😏

源码:function aa(fn){ if(fn)fn() }

UglifyJS ( webpack )

压缩:function aa(t){t&&t()}
no1xsyzy
2020-06-23 13:22:19 +08:00
@dremy #25 首先,你搞错了,这个问题不是 no-unused-expressions 。
其次,eslint 是可配置的。
ChanKc
2020-06-23 13:22:46 +08:00
果然出现了
js 一大争议:是否手动 minify
根源上是“程序主要是给人读的”还是“程序主要是给机器读的”的争议
nannanziyu
2020-06-23 13:23:08 +08:00
@taxiaohaohhh
负分是因为不能只判断不为空,而要判断 typeof === 'function'
if(typeof fn === 'function'){
fn()
}
ChanKc
2020-06-23 13:25:33 +08:00
换我我就写 typeof fn === 'function'
lemon6
2020-06-23 13:27:27 +08:00
短路写法啊,减少代码量,而且就这么一点东西哪有降低可读性一说?
zhuweiyou
2020-06-23 13:29:53 +08:00
这样写是错误的,应该 typeof fn === "function"
marcong95
2020-06-23 13:30:23 +08:00
@dremy #25 这只是 ESLint 的一个规则,并不代表这种写法不被提倡,何况你这个规则也并不在 eslint:recommended 里面

JS 里面大量需要判断函数非空,要是都 if 一下只会把代码弄得又长又臭
BrettD
2020-06-23 13:31:19 +08:00
@dremy 这个是非常常见的短路写法呀,怎么会降低可读性呢?
binux
2020-06-23 13:31:26 +08:00
@nannanziyu #29 你还得判断它是不是一个异步函数,再捕获它的异常。
ChanKc
2020-06-23 13:34:16 +08:00
真要减少代码量就上 ts
这检查还检查得不彻底
dremy
2020-06-23 13:35:13 +08:00
@BrettD 对于有代码洁癖的人来说,不能忍:语句就是语句,表达式就是表达式,把表达式当语句就是 zz 不正确
lizz666
2020-06-23 13:45:24 +08:00
你未来还会看到类似 window?.fb?.() 的
belin520
2020-06-23 13:47:20 +08:00
这样写思路是对的,实现是错误的,fn 可能存在,但是它可能不是 function,执行 fn() 一样会出错。

typeof fn === "function" && fn()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/684046

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX