等待非承诺有任何可检测的效果吗?

Does awaiting a non-Promise have any detectable effect?

可以 await 一个非 Promise 和 that's good so.

所有这些表达式都是有效的并且不会导致错误:

await 5
await 'A'
await {}
await null
await undefined 

等待非 Promise 是否有任何可检测的效果?为了避免潜在的错误,人们应该注意的行为有什么不同吗?有任何性能差异吗?

下面两行是完全相同还是理论上不同?:

var x = 5
var x = await 5

怎么样?任何例子来证明差异?

PS:根据TypeScript authors,有区别:

var x = await 5; is not the same as var x = 5;; var x = await 5; will assign x 5 in the next tern, where as var x = 5; will evaluate immediately.

await 不是空操作。如果等待的东西不是一个承诺,它被包裹在一个承诺中,那个承诺是等待的。因此 await 改变了执行顺序(但你不应该依赖它):

console.log(1);
(async function() {
  var x = await 5; // remove await to see 1,3,2
  console.log(3);
})();
console.log(2);

此外 await 不仅适用于 instanceof Promises,而且适用于每个具有 .then 方法的对象:

await { then(cb) { /* nowhere */ } };
console.log("will never happen");

Is there any detectable effect of awaiting a non-Promise?

当然,.then 如果它存在于等待的事物上,就会被调用。

Is there any difference in behavior one should be aware of to avoid a potential error?

如果您不希望方法成为 Promise,请不要命名方法 "then"。

Any performance differences?

当然,如果您等待某些事情,您将始终将继续推迟到微任务。但一如既往:您可能不会注意到它(作为观察结果的人)。

完全同意乔纳斯的说法。他的问题中没有回答的一件事是 以下两行是完全相同还是理论上不同?:

以下两行不完全相同,理论上是不同的。

  1. 变量 x = 5
  2. var x = 等待 5

在我的控制台中,第一条和第二条语句的执行时间分别为 0.008056640625ms0.055908203125msasync/await、setTimeOut等是运行时间提供的API,其中JavaScript运行时间为运行. 将等待放在非承诺上将在 event-loop 中执行。第 1 行将在到达 stack 后立即执行,但第 2 行将花费一些时间(毫秒),因为它会在跳过 webAPI 等待后首先转到 stack 然后转到 task queue部分,因为没有承诺要解决 & 最后,控制权将再次交给 stack 执行。