2

查看 Mozilla 的 JavaScript 指南中的这些文章:

表达式

声明

表达式也被认为是赋值语句。事实上,在第二篇文章中可以读到“任何表达式也是一个语句”。熟悉其他编程语言后,我认为表达式始终是值,但它们不会像语句那样引起副作用。换句话说,7, 7 + 8, "string" 等是表达式,因为它们不会改变状态,但是 a = 7 是一个语句,因为现在已经定义了一个变量(即状态已经改变)。

为什么 Mozilla 在 JS 中不区分两者?

4

3 回答 3

5

我相信您从字面上理解“表达”和“陈述”这两个词。“表达式不改变任何状态”对于编程语言来说是一个非常严格的要求。

一个思想实验:7 + 8代替8函数调用

var globalVar = 0;
function my8() { 
  globalVar = globalVar + 1; 
  return 8;
} 

7 + my8()语句还是表达式?这里没有明显的状态变化,但仍然my8执行状态变化。使用“无副作用”定义,如果不分析函数代码,就不可能确定7 + my8()是语句还是表达式。my8当然,可以简单地禁止任何状态更改作为函数调用的一部分,但这不是 JavaScript 的方式。

根据我的经验,大多数语言都将“所有返回值的东西”定义为表达式和语句,而其他所有内容都只是一个语句。

要回答您的问题“为什么 Mozilla 不会在 JS 中区分这两者?”:

我认为他们会这样做,但不是以您期望的方式。考虑“所有返回值的东西”,表达式似乎是最实用的方法。

一块代码同时作为语句和表达式之间也没有矛盾。这就是 Javascript 和许多其他语言的工作原理。当然,总是可以在这两者之间划出更严格的界限。

例子:

赋值返回值,所以这是可能的:

 a = b = c = 1;

它可以写成更明显的形式:

 a = (b = (c = 1));

因此,赋值被认为是一个表达式(也是一个语句)。

另一方面:

if (true) { };

不返回值(在 Javascript 中!),因此不是表达式(但仍然是语句)。

于 2013-08-20T08:03:50.967 回答
1

表达式是返回某个值的代码片段,表达式(计算机科学)

3; // 3
{}; // Object
func(); // whatever func returns, or undefined if not specified

您可以将表达式组合成一个复合表达式:

3 + 7; // 10
{}, []; // Array. Comma operator always returns result of right-most expression

语句是可以编译或解释的最小有效代码片段,语句(计算机科学)

5; // valid js

您还可以将语句组合成复合语句:

check || func(); // valid js
{
    4 + 9;
    "block statement";
}

在 Mozilla 文档中,语句是指由分号 (;) 显式或隐式终止的任何(复合)语句。

[,,[],[,[,,],,]]; // Array declaration whose reference is returned (and ignored)
// Multi-dimensional array with empty (undefined) elements

在某些编程语言中,上述示例无法编译或无法解释。其他语言可能不允许不捕获表达式的结果。

Javascript 的表现力很强这就是为什么每个表达式都算作有效语句的原因。有些语句不是表达式,如break、return、while等。它们不返回任何值,但它们控制程序执行流程

于 2014-03-10T22:36:56.183 回答
0

Mozilla 确实区分了两者,或者更确切地说是 Javascript 语法。

关于 Javascript 唯一有点“特殊”的地方如下:

“任何表达也是陈述”

这意味着在语法中需要语句的地方,可以直接使用表达式(但不能反过来)。例如,以下是有效的 Javascript,但在许多其他类似语言中无效:

if (true) "asfd"

或者

foo = function(){
  if (5) { 
    "some text here that won't do anything";
    return true;
    42; // always good to have that one here!
  }
}

而语句不能用作表达式:

a = (if (true) 5)   // does not work "unexpected token 'if'"

他们将该“功能”用于严格模式规范,而没有引入新的关键字或语法 - 如果您将表达式 "use strict"添加为函数体中的第一条语句,则 Javascript 在支持的浏览器中以严格模式执行。

虽然表达式计算为一个值,但语句通常不会。大多数语句会改变控制流,而表达式通常不会(尽管有人可能会争辩说,导致抛出异常的表达式也会改变控制流)。在 Javascript 中,表达式是所有语句的子集。

于 2013-08-20T10:12:29.767 回答