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

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

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

function(){
  fn&&fn()
}

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

8465 次点击
所在节点    JavaScript
92 条回复
taxiaohaohhh
2020-06-23 13:47:25 +08:00
@nannanziyu
就我回复的层主,{fn ? fn(abc) : null},你要讲没判断是否是函数负分,if 能加难道我这个加不了?
ChanKc
2020-06-23 13:49:38 +08:00
用一个很流行的词来说这个代码:心智负担
要彻底看懂这个代码,需要
1 完全记住 js 的自动类型转换规则
2 记住 0, NaN, null, undefined, ''是 falsy 的值,其它都是 truthy 的

而且以上两条基本要靠死记硬背,没什么规律可言
基本上偏学术性的编程书都不推荐这个写法
偏工程的就有一些推荐的,原因就只有减少代码量
marcong95
2020-06-23 13:50:29 +08:00
@dremy #38 那么问题来了,单纯的 fn() 是语句呢,还是表达式呢?那说 new Vue({ ... }) 呢
Marstin
2020-06-23 13:51:27 +08:00
如果按照楼上的众多反对说法,三元表达式和 lambda 表达式都应该取缔。

避免因程序报错中断因而影响后续逻辑的继续执行,这种短路用法不是很实用吗
starcraft
2020-06-23 13:54:13 +08:00
哈哈哈 还有人说这是装笔的。这是对得不能再对的做法了。果真无知才是最装笔的。评论区依旧没让人失望。
slxyzzl
2020-06-23 14:06:45 +08:00
我想问业务代码这么写有什么问题,老项目我们全是这样写的,新项目换成可选链了
ypzhou
2020-06-23 14:06:58 +08:00
fn?.()
lscho
2020-06-23 14:09:16 +08:00
难道我这么多年 js 白写了吗?这难道不是回调函数时正常的写法?

也不需要 typeof fn === "function" 判断,因为期望参数 fn 是函数,如果不是,那就应该抛出异常。
no1xsyzy
2020-06-23 14:10:55 +08:00
@dremy #25 又翻了一下只看到 no-unneeded-ternary 里面 Good 例子用到了 bar || 1

而 fn && fn() 是 lint-free 的,即使钩上所有 rule
( ES2016 + browser )
大概需要避免 fn && fn() 需要自己写扩展

document.write(((fn) => {

"use strict";

return fn && fn();

})());
no1xsyzy
2020-06-23 14:11:57 +08:00
@no1xsyzy #49 这个因为 v2 排版会糟糕…… 只有空格问题,用 Fixed code 过一遍即可。
IGJacklove
2020-06-23 14:16:12 +08:00
@dremy 也不会把,现在 ts 都有?. 和??各种操作了,要是都 if 判空不得累死你?
zxcslove
2020-06-23 14:42:25 +08:00
@ChanKc 抓到根本了
xcatliu
2020-06-23 14:42:59 +08:00
@dremy 你怕是没读过 React 官方文档吧。React 的标准写法分明是 <div>fn && fn(abc)</div>
https://reactjs.org/docs/conditional-rendering.html#inline-if-with-logical--operator

BrettD
2020-06-23 14:56:32 +08:00
@dremy 初学编程的时候不都是要学到这个短路写法吗…这种常规写法怎么在你那里成政治不正确了……
whileFalse
2020-06-23 15:06:08 +08:00
@dremy 这种写法出现的时候你大概还不会写程序。
Sapp
2020-06-23 15:06:09 +08:00
现在用这个:fn?.()
zhjie
2020-06-23 15:07:21 +08:00
对于 js 来说 这么写基本没有心智负担。甚至面试都会提问。
maichael
2020-06-23 15:09:20 +08:00
@ChanKc #33 上 TS 也解决不了这问题,你不能担保调用你这个函数的人也用的 TS,而且也存在 fn 可以为空的情况。
goodboy95
2020-06-23 15:12:34 +08:00
@ChanKc js 里面记住非 true 的情况感觉是基本吧,而且这个明显就是只为了回避 null 和 undefined. 这都有心智负担的话,我只能怀疑拿到代码的人以前根本就没碰过 js,临时被拉去维护 js 项目。只要是写 js 吃饭的,这种代码应该都是瞄一眼就过去的事情。
Jirajine
2020-06-23 15:13:13 +08:00
这个就是 js 逻辑运算符的魔法:
当多个 &&串联时,执行到第一个 truthy 的表达式;
当多个||串联时,执行到第一个 false-thy 的表达式;
但我比较赞同王垠博客上的观点:短路机制是给程序优化执行效率的,不是给程序员拿来炫技的。

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

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

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

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

© 2021 V2EX