如何在 Node.js 12 中使用可选链

alm*_*arc 85 javascript node.js

可选链接 ( obj?.param1?.param2) 似乎是一个很棒的功能,我真的很想看到它的实现,并最终摆脱嵌套的 ifs、任意函数以及如此简单的操作所不具备的功能。

但是有一个问题,它不起作用。我更新到 Node 12,但仍然出现错误:

var dude = res?.param?.params[0]
SyntaxError: Unexpected token '.'
Run Code Online (Sandbox Code Playgroud)

或者

var dude = res.param?.params[0]
SyntaxError: Unexpected token '.'
Run Code Online (Sandbox Code Playgroud)

问题是什么?

我是否需要更改某些语言配置或下载库以启用此功能?或者它只是还没有出来?

Bal*_*han 114

Node.js 13 及以下版本目前不支持可选链。Node.js 版本 14 和大多数浏览器都将支持它,因为它已移至 Stage 4。目前,支持它的平台很少。您可以在给定的链接中找到支持可选链接的平台列表。您可以使用--harmony标志启用可选。

  • 2021 年 1 月:这仍然是 Codesandbox 网站中的一个问题,该网站采用 Nodejs 的官方 docker 镜像。我必须使用 `result && result.insertedCount === 1 ?{ 数据: "成功" } : { 错误: "失败" }` (3认同)
  • 如果您使用 esm,则可选链接将无法在 Node 14+ 上运行,直到此票证得到修复 https://github.com/standard-things/esm/issues/866 (2认同)

Joe*_*ite 26

可选链接功能的规范于201912 月 22 日刚刚提升到第 4 阶段(已完成)。Node 12 在规范最终确定之前就出现了 - 就此而言,Node 13 也是如此。

根据node.green,从 Node 14 开始将支持可选链接,但仍需要该--harmony标志。(这似乎与 Node 对--harmony标志的描述相冲突- V8 的传送功能不应该需要标志 - 所以我不确定该怎么做。)不过,无论是否需要标志,我都不会预计在2020 年 4 月左右发布 Node 14 之前会看到该功能。

如果您今天想使用可选链,最好的办法是使用 TypeScript(它在 3.7 版中添加了可选链)或像Babel这样的预处理器。


小智 16

我能够使用带有 --harmony 标志的 nodejs v13.7.0。

节点 --harmony myCode.js

底拿

不明确的

不明确的

//myCode.js

const adventurer = {
  name: 'Alice',
  cat: {
    name: 'Dinah'
  }
};

const catName = adventurer.cat?.name;
console.log(catName);
// expected output: Dinah
const dogName = adventurer.dog?.name;
console.log(dogName);
//expected output: undefined

console.log(adventurer.someNonExistentMethod?.())
//expected output: undefined
Run Code Online (Sandbox Code Playgroud)