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

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

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

function(){
  fn&&fn()
}

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

9177 次点击
所在节点    JavaScript
92 条回复
ChanKc
2020-06-23 15:14:16 +08:00
@maichael 如果是完全内部使用的函数,ts 可以解决问题。我刚刚在 playground 上试了一下,指定 fn 为 Function 类型,如果 fn 是空就会编译错误。如果是对外的函数,这个判断也需要假设用户传入的要么是 falsy 的值要么是函数。那么为什么不干脆假设用户传入的就是个函数?
maichael
2020-06-23 15:18:25 +08:00
@ChanKc #57 因为你没法这么假设,需求完全可能是 fn 的类型是 Function | undefined,这是需求层面决定的,传了我就执行,不传我就不执行,这是很正常的需求。
ChanKc
2020-06-23 15:18:49 +08:00
@goodboy95 Cay S Horstman 就觉得这个不是基本的。Douglas Crockford 也建议“Use booleans in all conditions”
ChanKc
2020-06-23 15:20:21 +08:00
@maichael 如果需求是这样,显式的===undefined 然后让 minifier 去 minify 不好吗
ChanKc
2020-06-23 15:25:37 +08:00
@goodboy95 要达到你这个要求,你就要在招聘的时候让每个应聘者背出 falsy 的值,确保不会有别的团队写 c 的写 java 的调岗到你的团队,然后你才可以放心地使用各种 truthy 和 falsy 的 hack 而保证不出错
no1xsyzy
2020-06-23 15:47:28 +08:00
@Jirajine #60 说反了吧…… 另外,stackoverflow 上都是喊 falsy 的…… (虽然我第一次是在 codegolf meta 上看到的)(又想起你的黑历史了,不会英文强行秀)
@ChanKc #42 这其实在 Reddit 和 StackOverflow 上都有过讨论。这个其实是 Shell 带下来的毛病。
#65 不过,你在招聘时会让每个应聘者背出三位一体甚至九九八十一宫格吗?需要背出字符串对象的全部方法吗?我第一次看到这个表达方式我就大致猜到什么意思,那之前写的甚至是 Pascal 。
bojackhorseman
2020-06-23 15:49:36 +08:00
这也能吵起来。。。
ChanKc
2020-06-23 15:55:31 +08:00
@no1xsyzy 我当然猜得到,问题根本不在短路,而是在强制类型转换。JS 的强制类型转换规则对别的语言的程序员来说是很奇葩的
no1xsyzy
2020-06-23 16:00:49 +08:00
@ChanKc #68 慢点这里没有强制类型转换啊,你说的是隐式类型转换的话,Python 、C 、Java 等等一大堆都有任何东西当作布尔的倾向,以至于 codegolf meta 那边专门提出 “如果要返回 True/False 的话 Truthy 和 Falsy 是否可以直接用”,最后提出能塞进分支判断直接当 True/False 用的都算(因为是 Code Golf 所以需要进行社区约定)
自然,三位一体本身倒是让人难受,但 T/F 我觉得还不至于,总比 't 和 nil 是标准形态好多了。
optional
2020-06-23 16:06:09 +08:00
@dremy 在 js 的世界里, &&才是政治正确。
Jirajine
2020-06-23 16:07:58 +08:00
@no1xsyzy 没有反,&&遇到 true 就短路所以是执行到第一个 truethy 的表达式后停止,当然这里说执行不准确应该是 evaluate 。
不是我秀英文,这个词我中文表示出来。而且这俩本来就是词典里没有的生造词,忘了别人怎么写的了我就随手打出来,能表达清意思就够了,论坛回帖又不是写论文,何必咬文嚼字。
ChanKc
2020-06-23 16:16:15 +08:00
@no1xsyzy 是,隐式的自动类型转换,一个笔误
DOLLOR
2020-06-23 16:25:58 +08:00
请用最新写法 [fn?.()] ,更简单易读,其他的都别争了,省点口水吧。
proger
2020-06-23 16:47:05 +08:00
@DOLLOR 老哥 你的这个写法是什么意思 ,可以举个例子吗?谢谢
Marstin
2020-06-23 16:50:07 +08:00
@DOLLOR 学到了
DOLLOR
2020-06-23 16:51:29 +08:00
@progerchai

就是?.操作符,不包括方括号,我把引号打成方括号了。
可以参见这里:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
ke1vin
2020-06-23 17:27:04 +08:00
不用判断类型?
ChanKc
2020-06-23 17:53:53 +08:00
@DOLLOR 或者 fn ?? fn()
感谢,又看了眼 spec
ChanKc
2020-06-23 17:54:39 +08:00
@ChanKc 噢我这个是错的
no1xsyzy
2020-06-23 18:07:51 +08:00
@Jirajine #71 提问:
1 && 2 && 3 && 4 = ?
null || undefined || 0 || "" = ?
&& 是遇到 false 短路啊,遇到 true 继续,不然怎么是 if(a){b} 呢

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

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

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

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

© 2021 V2EX