查看 Mozilla 的 JavaScript 指南中的这些文章:
表达式也被认为是赋值语句。事实上,在第二篇文章中可以读到“任何表达式也是一个语句”。熟悉其他编程语言后,我认为表达式始终是值,但它们不会像语句那样引起副作用。换句话说,7, 7 + 8, "string" 等是表达式,因为它们不会改变状态,但是 a = 7 是一个语句,因为现在已经定义了一个变量(即状态已经改变)。
为什么 Mozilla 在 JS 中不区分两者?
查看 Mozilla 的 JavaScript 指南中的这些文章:
表达式也被认为是赋值语句。事实上,在第二篇文章中可以读到“任何表达式也是一个语句”。熟悉其他编程语言后,我认为表达式始终是值,但它们不会像语句那样引起副作用。换句话说,7, 7 + 8, "string" 等是表达式,因为它们不会改变状态,但是 a = 7 是一个语句,因为现在已经定义了一个变量(即状态已经改变)。
为什么 Mozilla 在 JS 中不区分两者?
我相信您从字面上理解“表达”和“陈述”这两个词。“表达式不改变任何状态”对于编程语言来说是一个非常严格的要求。
一个思想实验: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 中!),因此不是表达式(但仍然是语句)。
表达式是返回某个值的代码片段,表达式(计算机科学):
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等。它们不返回任何值,但它们控制程序执行流程。
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 中,表达式是所有语句的子集。