因此,我的理解是语句和表达式之间的区别在于语句是执行某些操作的代码行,而表达式则生成值。此外,虽然有意义的是并非所有语句都是表达式,因为并非所有语句都解析为值(如if
,while
和for
的情况),如果表达式产生了价值,是不是考虑做某事,因此也是一个陈述?
答案 0 :(得分:2)
由于您询问了使用computer-science
以及javascript
标记的问题,我想我已经指出JavaScript在这方面与其他几种流行语言不同。
例如,在Java和C#中,您不能将算术表达式用作语句。
public class C {
public void M() {
1 + 2;
}
}
带有消息的C#编译器rejects this code:
错误CS0201:只能将赋值,调用,递增,递减和新对象表达式用作语句
Java编译器产生了类似的错误:
错误:不是声明
这样的表达式在代码中没有可观察到的影响,因此计算它是没有意义的。编译器设计者选择将此标记为编译错误,可能是为了帮助开发人员避免代码中的一类错误。
Kotlin发出警告:
警告:表达式未使用
D compiler(dmd)产生:
错误:+对表达式(1 + 2)无效
GCC 6.3(包括C和C ++)doesn't seem to complain(如果你打开-Wall
或其他扩展警告可能会这样做。)
斯威夫特也doesn't complain。
因此虽然JavaScript允许这样的表达式作为语句,但我认为它是语言规范的弱点而不是强度。如果返回值未在任何地方应用,则会浪费计算(在运行时或在JIT时),并可能隐藏错误,例如缺少返回语句。
最后要注意的是,如果某些编译器可以确定它没有副作用,则可能会忽略该表达式。例如,如果1 + 2 + doSomething()
执行任何可观察的操作(例如打印到屏幕或更新共享状态),则无法完全删除doSomething
,但是可以放弃前面的添加操作。
答案 1 :(得分:2)
语句和表达式之间的区别主要是语法上的区别,即它们是解析规则描述中使用的术语。
唯一重要的是它们有效的语法上下文。不,表达式与声明永远不是一回事。
传统上,语句描述了一个接一个地执行并且一个在另一个之下写入的代码单元 - 这就是您的“代码行”来自的位置。它们执行诸如声明函数和变量或负责控制流程之类的操作。它们通常由(嵌套)块组织,由JavaScript中的花括号分隔。
另一方面,表达式是通过评估运算符产生值的代码单元,通常不做任何事情 - 例如表达式2 + 3
可以计算为值5
,但该值没有任何反应。表达式可以通过任意嵌套,其他表达式形成运算符的操作数。
各种语言将不同的东西定义为语句和表达式,因为没有内在的差异,而是有一些相互关联的相似性 - 它们可以嵌套,有规则(在类型上)要强制执行等等 - 所以分配或如果 - 条件可以是一种语言的语句和另一种语言的表达式(块只是具有自己的运算符和评估规则的另一种类型)。
对于JavaScript,规则在规范中详细说明,它明确区分statements与expressions。但是有一点含糊不清,因为有表达式语句,它是一个只包含表达式(待计算)和一个尾随分号的语句 - 但分号是可选的。不过,这是包含表达式的声明,它不是一个既是语句又是表达式的东西。
通过这个,有一些代码部分可以作为两者有效,如果不查看上下文,就无法区分。