【问题标题】:Why is yield classed as an operator and not a statement?为什么 yield 被归类为运算符而不是语句?
【发布时间】:2020-08-09 05:10:09
【问题描述】:

我查看了mdn javascript reference 并注意到yield 列在操作符部分。另一方面,return 被列为声明。我还发现 yieldoperator precedence 为 2。

yield 的哪些特性使它落入了操作符类而不是语句?为什么return 属于语句而不是运算符?

【问题讨论】:

  • 我认为,定义尚不清楚。 await 被列为表达式。但它看起来/工作与产量相同。

标签: javascript syntax yield


【解决方案1】:

它是一个运算符,因为它可以在表达式中使用。

function* g() {
    value = 3;
    while (value !== 5) value = Math.floor(yield value + 1);
}

var gen = g();

console.log(gen.next().value);
console.log(gen.next(1.5).value);

【讨论】:

  • 这是一个很好的观点。考虑一个函数语句 - 它不能在该上下文中使用,而函数表达式可以。
【解决方案2】:

对此我不确定,但在生成器yield 的上下文中,它会将数据发送到generator.next(),它的运行方式与函数非常相似。运算符是大多数语言(包括 JavaScript)中的特殊函数类。

几乎可以想象generator.next 调用它的实例,传递一个关于从哪里恢复的回调。而yield 调用该回调

Return 表示执行路径的结束,并将返回值替换到正确的内存位置,并将调用堆栈展开 1 个单位。如果感觉对语言的定义很原始,

【讨论】:

  • syntax 级别,yield 的行为是否不同?显示,例如。即“产量 a,产量 b;”,“q = 产量 a;”或类似的就足以显示差异。语法部分将是相关的,因为语法会改变分类。
  • 我不知道。最初的问题和您提出的问题都很有趣。我所知道的是,运算符都是某种类型的函数(一元或二元),并且在用户定义的代码范围内工作。 Return 具有明显低于该值的机制(例如调用堆栈)并扩展到用户定义的位。
  • ecma-international.org/ecma-262/10.0/index.html 包含答案。返回结束函数是不相关的。在 C# 中,“yield”是一个语句。在 JavaScript 中,“function”(可以是 a)是不影响流程的语句。
  • 讨论 return 的目的是在广义上对比运算符和语句之间的区别。但我认为妮娜拥有它。
  • “陈述”与“表达”作为语法结构存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多