为什么这个JavaScript语句中的变量“a”不是变量表达式?

时间:2016-11-30 02:31:18

标签: javascript

在Kyle Simpson的“你不知道JS”系列的第一本书“Up&amp; Going”中,他提出了以下陈述,并解释说它包含 < / strong>表达式:

a = b * 2;

他说:

  • 2 是文字值表达式
  • b 是变量表达式
  • b * 2 是一个算术表达式
  • a = b * 2 是作业表达

我同意所有这些。

Mozilla开发者网络将expression定义为 解析为值 的任何有效代码单元。

不是变量表达式,因为它是LHS表达式并被分配而不是评估?

4 个答案:

答案 0 :(得分:2)

非正式地,表达式符合表达式的语法,并被视为表达式,因为它出现在表达式上下文中。它被评估并产生一个值。

例如,{}是一个表达式,仅在表达式上下文中指示空对象文字;在其他地方它可能是一个块。对于以function关键字开头的句法结构也是如此。

相反,我们通常不会将作业的左侧视为&#34;表达&#34;。当然,我们不能写a + 2 = 3。即使左侧可以被视为表达式,例如aa.b,我们通常也不会将其称为表达式,因为我们会想到表达式是被评估的东西,而这样的左侧是&#34;引用&#34;。

正是这种常见用法表明,您的图书的作者并未将a标识为a = b * 2中的表达。

然而,术语水域因规范中使用的令牌的名称而有些混乱。该规范定义了一个名为 AssignmentExpression 的东西,它基本上是任何表达式,如2aa + 2a = b(其计算结果为{{ 1}})。到现在为止还挺好。但它继续定义一个名为 LeftHandSideExpression 的东西,这显然是在赋值的左侧(或应用b等)发生的,但是将其定义为++。什么?我们不能在左侧放置AssignmentExpression,我们可以吗?该规范通过限制哪种 AssignmentExpression 可以作为 LeftHandSideExpression 来解决这个问题,例如排除2(因为它不是&#34; IsValidSimpleAssignmentTarget&#34;。)

所以 正确调用2中的a表达式 - 在术语&#34的常用用法中;表达&#34 ;.但是,从技术上讲,表达式在技术上是正确的,因为在规范中使用了该单词,其中它是 LeftHandSideExpression

答案 1 :(得分:1)

这没有任何意义。 a是一个变量表达式,就像b一样,它们都评估为变量引用。然后使用不同的方法 - 正在访问b引用的值,并将值放入a引用中。尽管如此,两个标识符都构成了表达式。

然而,这是技术性的(并且甚至没有官方术语“变量表达式”),为了简化目的,我想这里省略了。但是,在更复杂的代码中,将左侧视为非表达式会分开。

答案 2 :(得分:0)

从技术上讲,它们被称为Identifiers(如果使用非终端符号名称,则为 IdentifierReference ),而不是变量表达式,它们的计算结果为references。 LHS也被认为是表达。语法包括 NewExpressions CallExpressions MemberExpressions PrimaryExpressions (标识符所属)。赋值运算符语义不允许使用其中的许多表达式。

从技术上讲,a还有一个表达式。

答案 3 :(得分:-1)

a仍然是一个变量,它只是全局定义

这也是一个聪明的代码转换技巧,因此您不需要为每个变量使用var

然而,在日常代码中,它最常见于for循环:

for(i=0;i<inputArray.length;i++){
    // so on and so forth
}