Skip to content

什么是语句和表达式

JavaScript 遵循了一般编程语言的“语句 - 表达式”结构,多数编程语言都是这样设计的。

本篇再次与《重学前端》的语法篇联动。winter老师在文章中表达了一个观点,他似乎是认为在javascript中,如何区分"声明"和"语句"的是一个复杂的问题。

但是,到目前为止,我甚至不知道为什么区分这两个概念是一个复杂的问题。

为此我去找了一下编程语言中的结构,除了"语句-表达式"之外,还有什么?

  1. "语句-表达式"结构
  2. “声明-表达式”结构
  3. “声明-语句-表达式”结构

下面列出的是《重学前端》语法篇中的普通语句类型:

  1. 表达式语句(ExpressionStatement)
  2. 空语句(EmptyStatement)
  3. 调用函数语句(CallExpression)
  4. 赋值语句(AssignmentExpression)
  5. 条件语句(IfStatement)
  6. 循环语句(ForStatement、WhileStatement、DoWhileStatement、ForInStatement、ForOfStatement)
  7. 迭代语句(ContinueStatement、BreakStatement、ReturnStatement、ThrowStatement)
  8. 代码块语句(BlockStatement)
  9. 标签语句(LabelledStatement)
  10. with 语句(WithStatement)
  11. switch 语句(SwitchStatement)
  12. try...catch 语句(TryStatement、CatchClause、ThrowStatement、FinallyStatement)
  13. debugger 语句(DebuggerStatement)

下面列出的是语法篇中的声明型语句类型:

  1. 变量声明语句(VariableDeclarationStatement)
  2. 函数声明语句(FunctionDeclarationStatement)
  3. 类声明语句(ClassDeclarationStatement)

令我不解的是,为什么winter老师会将语句类型划分为普通语句和声明型语句。声明型语句不一定会有赋值语句,但是赋值语句一定会与声明语句一起出现。

如果按表达式分,声明型语句出现在等号的左边,也可以说是左值表达式。但是class声明又是一个例外。

随着普通声明语句的出现,都会伴随出现一个作用域。声明语句var是一个老旧的意外,let与const是一个比较符合使用直觉的语句,它们绕过了预处理机制。

所谓的预处理,就是《重学前端》开篇提到的javascript运行机制里面的变量提升,它有一个非常著名的js面试题,请简述一下var 与 let、const的差异。


在 JavaScript 中,表达式(Expression)是由一个或多个值、变量、操作符和函数调用等组成的代码片段,它可以出现在赋值语句、函数调用和各种条件和循环语句等地方。当表达式作为一条完整的语句出现时,它被称为表达式语句(Expression Statement)。

下面列出的是语法篇中提出的表达式:

  1. 主要表达式 (Primary Expression)
  2. 成员表达式 (Member Expression)
  3. New值表达式 (New Expression)
  4. 函数调用表达式 (Call Expression)
  5. 左值表达式 (LeftHandSide Expression)
  6. 赋值表达式 (Assignment Expression)

通过查找资料,还有以下几种表达式:

  1. 标识符表达式(IdentifierExpression)
  2. 字面量表达式(LiteralExpression)
  3. 运算符表达式(BinaryExpression)
  4. 函数表达式(FunctionExpression)
  5. 其他表达式(ArrayExpression、ObjectExpression 等)

MIT License.