什么是语句和表达式
JavaScript 遵循了一般编程语言的“语句 - 表达式”结构,多数编程语言都是这样设计的。
本篇再次与《重学前端》的语法篇联动。winter老师在文章中表达了一个观点,他似乎是认为在javascript中,如何区分"声明"和"语句"的是一个复杂的问题。
但是,到目前为止,我甚至不知道为什么区分这两个概念是一个复杂的问题。
为此我去找了一下编程语言中的结构,除了"语句-表达式"之外,还有什么?
- "语句-表达式"结构
- “声明-表达式”结构
- “声明-语句-表达式”结构
下面列出的是《重学前端》语法篇中的普通语句类型:
- 表达式语句(ExpressionStatement)
- 空语句(EmptyStatement)
- 调用函数语句(CallExpression)
- 赋值语句(AssignmentExpression)
- 条件语句(IfStatement)
- 循环语句(ForStatement、WhileStatement、DoWhileStatement、ForInStatement、ForOfStatement)
- 迭代语句(ContinueStatement、BreakStatement、ReturnStatement、ThrowStatement)
- 代码块语句(BlockStatement)
- 标签语句(LabelledStatement)
- with 语句(WithStatement)
- switch 语句(SwitchStatement)
- try...catch 语句(TryStatement、CatchClause、ThrowStatement、FinallyStatement)
- debugger 语句(DebuggerStatement)
下面列出的是语法篇中的声明型语句类型:
- 变量声明语句(VariableDeclarationStatement)
- 函数声明语句(FunctionDeclarationStatement)
- 类声明语句(ClassDeclarationStatement)
令我不解的是,为什么winter老师会将语句类型划分为普通语句和声明型语句。声明型语句不一定会有赋值语句,但是赋值语句一定会与声明语句一起出现。
如果按表达式分,声明型语句出现在等号的左边,也可以说是左值表达式。但是class声明又是一个例外。
随着普通声明语句的出现,都会伴随出现一个作用域。声明语句var是一个老旧的意外,let与const是一个比较符合使用直觉的语句,它们绕过了预处理机制。
所谓的预处理,就是《重学前端》开篇提到的javascript运行机制里面的变量提升,它有一个非常著名的js面试题,请简述一下var 与 let、const的差异。
在 JavaScript 中,表达式(Expression)是由一个或多个值、变量、操作符和函数调用等组成的代码片段,它可以出现在赋值语句、函数调用和各种条件和循环语句等地方。当表达式作为一条完整的语句出现时,它被称为表达式语句(Expression Statement)。
下面列出的是语法篇中提出的表达式:
- 主要表达式 (Primary Expression)
- 成员表达式 (Member Expression)
- New值表达式 (New Expression)
- 函数调用表达式 (Call Expression)
- 左值表达式 (LeftHandSide Expression)
- 赋值表达式 (Assignment Expression)
通过查找资料,还有以下几种表达式:
- 标识符表达式(IdentifierExpression)
- 字面量表达式(LiteralExpression)
- 运算符表达式(BinaryExpression)
- 函数表达式(FunctionExpression)
- 其他表达式(ArrayExpression、ObjectExpression 等)