【问题标题】:What's the meaning of UnaryExpression of ES6 Spec documentation?ES6 Spec 文档的 UnaryExpression 是什么意思?
【发布时间】:2019-02-15 07:23:50
【问题描述】:

我很好奇 ES6 Spec 文档中 UnaryExpression 的含义。 https://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator

其实我很想知道为什么 typeof 运算符既可以接受不带括号的操作数,也可以接受带括号的操作数。
ex) typeof a / typeof (a)

所以我在互联网上搜索,发现 ES6 Spec 文档指导我 typeof 运算符可以接受 UnaryExpression。

UnaryExpression : UnaryExpression 的类型

并且还发现了这个 SO 答案。

https://stackoverflow.com/a/15843896/911528

在这篇文章中,用户 Halim Qarroum 回答了,

规范中typeof运算符的正确定义是:typeof[(]expression[)]

我不知道 UnaryExpression 的确切含义。 (我找不到。是的,定义在那里,但它们太抽象了。)

我很好奇 Halim Qarroum 如何仅通过查看规范文档来推断出这个答案。

[(]expression[)] 是否等于 UnaryExpression? [] 是否表示可省略?

【问题讨论】:

  • 那个答案已经过时了。源链接指向 MSDN,而 MSDN 又指向 MDN,其语法为 typeof operand。没有括号。可以添加括号以提高可读性或强制执行优先级。
  • @SalmanA 即使我在这里引用的 SO 链接已经过时,但我认为我的问题并没有过时。我在询问 ES6 Spec 文档中的 UnaryExpression。 Leroy Stav 完美地回答了我。

标签: javascript typeof


【解决方案1】:

一元表达式是只有一个标记的表达式。 一元运算符(例如typeof++)将一元表达式作为操作数。

括号在包装一元表达式时被解析器忽略。因此,typeof(i)(i)++ 分别等效于 typeof ii++

是的,在开发人员文档中,方括号表示可选内容。通常用于可选函数参数,但在您引用的答案中可以理解。

【讨论】:

  • 你把我想知道的都告诉了我。非常感谢!
  • 你能告诉我更多关于令牌的信息吗? “一元表达式是只有一个标记的表达式”,我很好奇“标记”到底是什么意思。
  • “令牌”是开发人员所说的“字符串的一部分”。例如,如果您(在 javascript 中)执行 someString.split(' '),则您将 someString 拆分为由空格分隔的标记。在语言编译方面,在描述“表达式”和“语句”等内容时,其中之一是“源代码中的哪些标记与什么底层机制相关?”所以“只有一个标记的表达式”将是“当我们正在查看的代码部分预期是一个表达式并且该表达式最终将是一个单一引用时”
  • 所以具体来说,您复制过来的 ES6 文档 UnaryExpression : typeof UnaryExpression 基本上转换为以下内容:“代码中 typeof UnaryExpression 的任何实例也被认为是 UnaryExpression。此外,唯一可接受的调用typeof 的方法是当操作数是一元表达式时。”此外,如ecma-international.org/ecma-262/6.0/#sec-primary-expression 中所述,任何表达式都可以用括号括起来并产生自身。因此,typeof i 和 typeof (i)` 在功能上是等价的(实际上产生 相同 抽象语法树)
  • 清晰多了。所以现在我可以理解为什么“typeof (i)”和“typeof i”是一样的了。而且,我可以弄清楚为什么“typeof typeof i”也可以工作。再次感谢你。你真的很擅长理解我的观点。
猜你喜欢
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2023-03-20
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多