JavaScript中的可选链接

idm*_*ean 11 javascript

我最近在Swift编程了很多.今天,当我遇到问题时,我在JavaScipt做了一些工作:

是否有类似于JavaScript中的可选链接?一种防止undefined is not an object没有任何变量的方法?

例:

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

test().value();
Run Code Online (Sandbox Code Playgroud)

将失败一半的时间因为有时会test返回undefined.

我能想到的唯一解决方案是功能:

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

oc(test(), 'value');
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这样的事情:

test()?.value()
Run Code Online (Sandbox Code Playgroud)

问号后面的部分仅在test返回对象时执行.

但这不是很重要.还有更好的东西吗?运营商的神奇组合?

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

Ben*_*ick 6

在纯JavaScript中,您必须进行类型检查或构造代码,以便您知道对象将存在.

?.如果您愿意考虑预处理语言,CoffeeScript是一种可编译为JavaScript的语言,它为安全链接提供了一个存在运算符.

还有另一个讨论在这里你为什么不能在JS重现此问题.

关于未来版本的JavaScript中添加存在主体运算符的ESDiscuss论坛也有讨论.虽然它似乎并不遥远,但实际上并没有接近实际用途.此时更多的想法.

  • 我接受了你的答案,因为它真的回答了我的问题,不像下面的其他答案,因为它提供了一些有趣的信息. (2认同)

Jon*_*ood 5

这是目前的第1阶段提案,您可以在此查看其进度:

你今天可以使用babel插件:

https://www.npmjs.com/package/babel-plugin-transform-optional-chaining

可选链接运算符拼写?..它可能出现在三个位置:

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

笔记:

为了让foo?.3:0被解析为foo?.3:0(对于向后兼容性的要求),在词法语法的层次上添加一个简单的先行,以便字符序列?在这种情况下,不会将其解释为单个标记(?.标记不能紧跟一个十进制数字).

https://github.com/tc39/proposal-optional-chaining

还值得一试:

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

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

  • 这应该是2020年选择的答案。 (2认同)

Wil*_*een 5

可选链已经登陆 JS。我们可以通过?.对象属性访问中的运算符使用可选链。它允许我们尝试访问可能不存在(即存在undefined)的对象的属性,而不会引发错误。

这是一个代码示例:

const obj = {
  foo: {
    bar: 1
  }
};

// If we try to access property which doesn't exists
// it just returns undefined
console.log(obj.baz);

try {
  // Now we try to access a property of undefined which throws an error
  obj.baz.foz;
} catch (e) {
  console.dir(e.message);
}

// Now we use the optional chaining operator ?.
// We get undefined instead of an error
console.log(obj.baz?.foz);
            
console.log(obj.foo?.bar);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

2591 次

最近记录:

6 年,5 月 前