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

117

可选链 (obj?.param1?.param2) 似乎是一个很好的特性,我真的很想看到它实现,并最终摆脱嵌套的 if 语句、任意函数等等来执行如此简单的操作。

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

var dude = res?.param?.params[0]
SyntaxError: Unexpected token '.'

或者

var dude = res.param?.params[0]
SyntaxError: Unexpected token '.'

问题是什么?

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


5
它处于“第四阶段”。Node.js 目前还不支持此功能。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining - Sridhar
1
我搜索了“nodejs null propagation”,最初找不到这个问题。希望这条评论能提高搜索效果。 - Janosh
我恐怕无法对此做出太多贡献。虽然有一个标签,但它与Javascript无关,使用它会带来更多的困惑而不是好处。 - almarc
7
可选链现在在Node版本v14.2.0中得到支持。请更新! - allez l'OM
5个回答

156

目前,Node.js 13及以下版本不支持可选链。自Node.js 14版本起,以及大多数浏览器都支持了它,因为它已经进入了第4阶段。目前,只有少数平台支持可选链。您可以在给定的链接中找到支持可选链的平台列表。您可以使用--harmony标志启用可选链。


5
2021年1月:CodeSandbox网站仍存在此问题,该网站使用官方的Node.js Docker镜像。我不得不使用 result && result.insertedCount === 1 ? { data: "success" } : { error: "fail" } - Manohar Reddy Poreddy
1
如果您正在使用esm,可选链接在Node 14+上将无法工作,直到修复此问题的票 https://github.com/standard-things/esm/issues/866 - Cartucho

28
可选链特性的规范刚刚在2019年12月22日被推广到Stage 4(完成阶段)。Node 12发布之前规范尚未最终确定,事实上Node 13也是如此。
根据node.green的说法,可选链将从Node 14开始支持,但仍需要--harmony标志。(这似乎与Node对--harmony标志的描述相冲突-V8的发货功能不应该需要标志-所以我不确定该怎么处理。)然而,无论它是否需要标志,我都不期望在Node 14发布前看到这个功能,大约是在2020年4月左右。
如果你想今天就使用可选链,最好使用TypeScript(在3.7版中添加了可选链),或者像Babel这样的预处理器。

16

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

node --harmony myCode.js

Dinah

undefined

undefined

//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

4

0
如果您仍然遇到此问题,请检查您正在使用的节点版本node --version
如果您有nvm,请确保您正在使用实现导致错误的运算符的节点版本。
例如。
nvm install 15.8
nvm use 15.8

1
OP问如何在Node 12中使用它,而不是如何安装Node 15.8。 - kravemir
建议是,如果OP仍然遇到问题,请检查节点版本,并在必要时使用nvm更改 :) - lele
我之前使用了brew安装的node@12版本,一直都很好用。但是最近我不小心在brew中卸载了它,现在在brew中找不到node@12了。所以我尝试使用nvm安装12版本,但是在nvm中遇到了一些问题。你知道为什么会出现这个错误以及如何解决吗?因为如果我改变版本,会对其他库造成很大的影响。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接