Await的运营商优先级是多少?

mac*_*ost 20 javascript operator-precedence async-await

在Javascript中,某些运算符先于其他运算符处理:

1 + 2 * 3
// 1 + (2 * 3)
// 7 because * has higher precedence than +

1 === 0 + 1
// 1 === (0 + 1)
// true because + has a higher precedence than ===
Run Code Online (Sandbox Code Playgroud)

MDN具有所有运营商及其优先级的完整细分 ......除外await.

await getFoo() * 2; // await (getFoo() * 2) or (await getFoo()) * 2?
await getFoo() === 5; // await (getFoo() === 5) or (await getFoo()) === 5?
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释在等待之前/之后处理哪些运营商?

现在我觉得我必须添加一些可能不必要的括号,因为我不确定在之前/之后会处理什么await.虽然我知道我应该能够看到这一点,即使是MDN(文件IMHO的黄金标准)也没有答案.

Ber*_*rgi 18

一个AwaitExpressionUnaryExpression并且具有相同的优先级delete,void,typeof,+,-,~,和!,结合比任何二进制运算符更强.

这与yield其他除了逗号运算符之外的优先级低的优先级不同.这种设计决策作出,因为这两个yield a+bawait a + await b被认为是超过常见的情况(yield a) + (yield b)await (a + b).

  • 答案并没有明确“await”之前的运算符是什么。点 (.) 运算符的优先级高于“await”。如果你有一个名为“func”的“async”函数并且它返回对象“{prop: 'str'}”,则必须编写“(await func()).prop”才能正确获取属性,否则“ wait func().prop` 将返回 `undefined`。 (7认同)
  • 我还修复了MDN :-) (6认同)
  • 话又说回来,在大多数情况下 `url && wait fetch(url)` 就可以了。:) (3认同)
  • @JHH 原则上我倾向于避免“await”一般的非thenables,因为它往往会产生难以阅读的代码,正如您所善意地演示的那样;) (3认同)
  • 对于诸如“+”之类的运算符来说,这是完全合理的,但是,一个主要陷阱是将“&&”与“await”一起使用。考虑“await url && fetch(url)”。如果“url”在这里是假的,我们将短路并返回“url”的值(因此,通常是“未定义”)——这是有意的——但如果它是真的,我们将继续调用“fetch(url)”,但是该表达式返回 fetch 调用的_promise_,而不是_resolved value_。这里你想要的很可能是“await (url && fetch(url))”。 (2认同)
  • @Kutalia我不会在这个答案中重现[整个运算符表](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table),但是是的成员访问是优先级高于一元运算符的运算符之一。 (2认同)