请教一下一个使我震惊的 js 语法 ?.(没错,看起来很像三目但却不是:而是.)

2020-04-16 14:29:18 +08:00
 devwolf
举例
let a = {a:"1",b:"2"}
console.log(a?.a)

契机:另一个组的同事在一个 angular 项目里发现了这个语法的使用,
通过关键字查了一下也就这么个 csdn 的结果
《 angular 中的 ? 和 !》 https://blog.csdn.net/weixin_30908941/article/details/95594290

里面除了交代?可以判断前面的变量是否为 null 或 undefined 再执行后面,还有个!判断后面键所对应的值是否为 null 或 undefined,不过没有成功在 js 里再现这个!。

就我个人在网上的搜索结果来看,感觉这个?.的写法比!!还要冷门,用途的效果上个人感觉类似 react 写 jsx 进行页面渲染时的&&或者?:

当然,我自己的这些肤浅猜测总结也没什么营养,还请各位有了解或者感兴趣的分析一波这个?.吗
15624 次点击
所在节点    Node.js
106 条回复
LukeChien
2020-04-16 20:58:27 +08:00
现在很常见了,以前在模板引擎语法里很常见
yxcoder
2020-04-16 21:06:01 +08:00
因为 js 里面访问 undefined 或者 null 的成员会报错,所以如果调用很深,譬如这种,a.b.c.d.e.f,为了防止报错,要这么写

a?a.b?a.b.c?a.b.c.d?a.b.c.d.e?a.b.c.d.e.f:null:null:null:null:null

巨难看
所以出了个语法糖

a?.b?.c?.d?.e?.f
Pursue9
2020-04-16 21:15:24 +08:00
C# 还有 ?? ??=

a?.b 等同于 if(a == null) return null
还有 a??0 等同于 if(a == null) return 0
a??=0 等同于 if(a == null){ a = 0; return a;}
SilentDepth
2020-04-16 21:23:47 +08:00
@Pursue9 #83 Logical Assignment Operators,ES 这边已经 Stage 3,如无意外明年就纳入规范了
IGJacklove
2020-04-16 21:28:25 +08:00
还好吧,flutter 早就有这个语法了,kotlin 也有类似的语法,简单来说就是简化判空操作的,js 听说要新加这个语法,当时跑了是还不能用的
SilentDepth
2020-04-16 21:29:56 +08:00
Optional Chaining 不仅有 foo.bar?.qux ,还有 foo.bar?.( ) 呢
:-)
LeiNaD
2020-04-16 21:35:42 +08:00
可选链
bilberry
2020-04-16 21:42:40 +08:00
ES2020 里面的
bilberry
2020-04-16 21:42:53 +08:00
weyou
2020-04-16 23:10:49 +08:00
Python PEP505,不过这语法确实有点 magic,不符合 Python 的一贯风格,难怪还没被采纳
somebody
2020-04-16 23:21:57 +08:00
很多语言都有,这个叫 Safe navigation operator, Wikipedia 有 18 种语言的例子
https://en.wikipedia.org/wiki/Safe_navigation_operator
jinliming2
2020-04-16 23:23:24 +08:00
@yxcoder 您这个就算没有 ?. 语法,也可以不用 ?: 啊……
用 ?: 是丑,但是直接
a && a.b && a.b.c && a.b.c.d && a.b.c.d.e && a.b.c.d.e.f || null
也稍微好看一些啊……
(虽然还是 ?. 更香
HytonightYX
2020-04-16 23:37:44 +08:00
我还写过 webpack 的实现,不过只是用了正则替换来判断,不是很完美。
TC39 有关于可选链的解释。
hst001
2020-04-17 00:11:34 +08:00
很好用的语法糖,各大语言应该引入
errolli
2020-04-17 00:12:25 +08:00
C#里面就有。。。 后来换到用 Java 的公司就没这个待遇了
FutherAll
2020-04-17 00:18:05 +08:00
optional 更适合用来解包判空之类的。
如果用来判断布尔的话是有歧义的,比如:if (a?.b == 0)或者 if(a?.b == false),到底是 a 为空还是 a 不为空 b 为 false 或者 b 为空
param
2020-04-17 00:50:35 +08:00
原来 JS 也有了
Yumwey
2020-04-17 00:51:57 +08:00
可选链,香的很。震惊啥 TS 强推
guolaopi
2020-04-17 09:30:57 +08:00
我写 C#,这玩意儿都写了好几年了,基本就是日常。。。。。
学新语言的时候觉得没有 x?.x 还有 x??y 这种写法很别扭。。。。
ugu
2020-04-17 10:13:17 +08:00
angular 里面经常写

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

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

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

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

© 2021 V2EX