JavaScript中的可选链

36 浏览
0 Comments

JavaScript中的可选链

这个问题已经有答案了

在ES6/2015中使用Null安全属性访问(和条件分配)

我最近一直在Swift中编程。今天我在JavaScript中做了一些工作,然后有一个问题出现在我面前:

JavaScript中是否有类似于可选链接的东西?一种可以防止出现undefined is not an object的方法,而无需任何变量?

实例:

function test(){
   if(new Date() % 2){
      return {value: function(){/*code*/}};
   }
} 
test().value();

因为有时候test返回undefined,所以这将有一半的时间失败。

我唯一能想到的解决方案是使用一个函数:

function oc(object, key){
   if(object){
      return object[key]();
   }
}
oc(test(), 'value');

我想要能够像下面这样做:

test()?.value()

问号后面的部分只有在test返回一个对象时才会执行。

但这并不是非常优雅。有更好的方法吗?一些运算符的神奇组合?

编辑 我知道我可以重写test来返回一些东西。但我想知道是否有像是可选链接的东西。我对上面示例的特定解决方案并不感兴趣。如果无法控制返回undefined的函数,我也可以使用该方法。

admin 更改状态以发布 2023年5月24日
0
0 Comments

在纯JavaScript中,你必须进行类型检查或者构建代码结构以确保对象存在。

一种编译成JavaScript的语言CoffeeScript,提供了一个存在操作符?.供安全地链接,如果你愿意考虑一种预处理语言的话。

关于为什么你不能在JS中复制这种行为,这里还有另一个讨论(点击跳转)

在ESDiscuss论坛上,有关向JavaScript的未来版本添加存在操作符的讨论(点击跳转)。然而,它似乎没有实用价值,离实际应用还有很大差距。目前只是一个想法。

0
0 Comments

这是一个目前处于阶段4的提案,你可以在这里检查它的进展:
https://github.com/tc39/proposal-optional-chaining

你可以今天就使用babel插件:
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining

2020年1月11日更新:
Babel现在默认支持可选链接
https://babeljs.io/blog/2020/01/11/7.8.0

可选链接运算符的拼写方式为?.。它可以出现在三个位置:

obj?.prop       // optional static property access
obj?.[expr]     // optional dynamic property access
func?.(...args) // optional function or method call

备注:

为了使foo?.3:0被解析为foo ? .3 : 0(为了向后兼容),在词法语法的级别上添加了一个简单的前瞻,以便在该情况下不将字符序列?.解释为单个标记(?.标记不能紧接着小数数字)。

还值得一看:

https://github.com/tc39/proposal-nullish-coalescing

https://github.com/babel/babel/tree/master/packages/babel-plugin-proposal-nullish-coalescing-operator

0