AST 节点概念
Literal 字面量类
字面量类型 | 描述 | 示例代码 |
---|---|---|
StringLiteral | 表示字符串字面量 | 'Hello, World!' |
NumericLiteral | 表示数字字面量,包括整数和浮点数 | 42 , 3.14 |
BigIntLiteral | 表示大整数字面量(ES2020 引入) | 123n |
BooleanLiteral | 表示布尔值字面量 | true , false |
NullLiteral | 表示 null 值 | null |
RegExpLiteral | 表示正则表达式字面量 | /pattern/flags |
注意:在 JavaScript AST 的不同实现中,例如 Babel,可能会将这些字面量表示为单独的节点类型,而非统一归类于一个Literal
节点。但在 ESTree 规范等某些标准中,它们通常都被视为Literal
类型的子类。
Identifier 标志符类
- Identifier 节点出现在多种上下文中,如变量声明、函数名、对象或数组解构的键、导入导出语句中的模块名等。它代表了程序中具有唯一性的名字,但在实际运行时,其关联的具体值取决于上下文
Statement 语句类
类型(Type) | 描述 | 示例代码 |
---|---|---|
ExpressionStatement | 包含一个表达式的语句,如变量赋值、函数调用等 | let a = 1; |
BlockStatement | 由花括号 {} 包围的代码块,内部可以包含多个语句 | { let a = 1; console.log(a); } |
EmptyStatement | 空语句,仅用于占位符或语法结构需要的地方 | ; |
DebuggerStatement | 调试语句,暂停执行并启动调试器 | debugger; |
WithStatement | 已废弃,在严格模式下无效,提供一个作用域链,使代码在特定对象的作用域中执行 | with (obj) { a = b + c; } |
ReturnStatement | 函数中的返回语句,带可选的返回值 | return value; |
BreakStatement | 中断循环或 switch 语句的执行 | break labelName; 或 break; |
ContinueStatement | 继续下一次循环迭代 | continue labelName; 或 continue; |
LabeledStatement | 标签语句,为循环或 switch 提供可命名的目标,以便于 break 和 continue 使用 | label: for (;;) { break label; } |
IfStatement | 条件语句,根据条件执行不同的代码块 | if (condition) { ... } else { ... } |
SwitchStatement | 多分支选择语句,基于表达式的结果匹配多个 case 选项 | switch (expression) { case value: ... } |
ThrowStatement | 抛出异常语句,中断程序执行并抛出指定错误对象 | throw exception; |
TryStatement | 尝试/捕获/最终语句,用于处理可能发生的错误 | try { ... } catch (e) { ... } finally { ... } |
WhileStatement | 当给定的条件为真时,重复执行一个代码块 | while (condition) { ... } |
DoWhileStatement | 先执行一次循环体,然后检查条件是否为真,若为真则继续执行 | do { ... } while (condition); |
ForStatement | 传统的 for 循环,包含初始化、条件判断和更新部分 | for (init; condition; update) { ... } |
ForInStatement / ForOfStatement | 遍历数组、对象或其他可迭代对象的所有属性或元素的循环语句 | for (let key in obj) {...} 或 for await (let item of iterable) {...} |
Declaration 声明类
类型(Type) | 描述 | 示例代码 |
---|---|---|
VariableDeclaration | 变量声明,包括 var 、let 和 const 关键字。 | let a = 1; 或 const b = "Hello"; |
FunctionDeclaration | 函数声明,定义一个全局或局部作用域的函数。 | function myFunction() {...} |
ClassDeclaration | 类声明,定义一个新的类。 | class MyClass { ... } |
ImportDeclaration | ES6 模块导入声明,用于引入其他模块的变量或导出项。 | import { myModule } from './myModule.js'; |
ExportNamedDeclaration | ES6 模块命名导出声明,导出单个或多个标识符到外部模块。 | export const myExportedVar = 42; |
ExportDefaultDeclaration | ES6 模块默认导出声明,用于导出一个默认函数、类或对象。 |
Expression 表达式类
类型(Type) | 描述 | 示例代码 |
---|---|---|
Identifier | 标识符表达式,表示一个变量、函数名或对象属性的名称。 | myVariable , myFunction() , object.property |
Literal | 字面量表达式,包括字符串、数字、布尔值、null、undefined 和正则表达式的字面表示形式。 | 'Hello' , 42 , true , null , /pattern/flags |
TemplateLiteral | 模板字符串表达式,用于字符串插值。 | ${name} says hello! |
ArrayExpression | 数组表达式,表示数组字面量。 | [1, 2, 'three'] |
ObjectExpression | 对象表达式,表示对象字面量。 | { a: 1, b: 2, c: "three" } |
Property | 对象属性表达式,是 ObjectExpression 的一部分,描述键值对。 | a: 1 或 b: { value: 2, kind: 'init' } |
MemberExpression | 成员表达式,访问对象的属性或调用其方法。 | object.property 或 array[0] |
CallExpression | 函数调用表达式,用于调用函数或其他可调用对象。 | myFunction(arg1, arg2) |
NewExpression | 构造函数调用表达式,创建新对象实例。 | new MyClass(args) |
ArrowFunctionExpression | 箭头函数表达式,定义简洁的匿名函数。 | (arg1, arg2) => arg1 + arg2 |
FunctionExpression | 函数表达式,定义可以被赋值给变量或作为参数传递的函数。 | function myFunc(a, b) { return a + b; } |
SequenceExpression | 序列表达式,表示一组按照从左到右顺序执行并返回最后一个表达式结果的表达式序列。 | (expr1, expr2, expr3) |
UnaryExpression | 单元操作符表达式,包含一元运算符(如- 、+ 、! 等)和一个操作数。 | -a , typeof b |
AssignmentExpression | 赋值表达式,将右侧表达式的结果赋给左侧标识符或成员表达式。 | a = b , obj.prop = value |
UpdateExpression | 自增/自减操作表达式,递增或递减操作数的值。 | a++ , --b |
ConditionalExpression | 条件(三元)表达式,基于条件计算结果为真或假时返回不同的值。 | condition ? trueValue : falseValue |
SpreadElement / RestElement | 展开元素表达式,用于在数组或函数参数中展开数组或对象。 | [...arr] , function(fizz, ...args) {...} |
AwaitExpression | 异步等待表达式,在异步函数中等待 Promise 的结果。 | await promise |
YieldExpression | 生成器函数中的 yield 表达式,暂停生成器函数的执行并产出一个值。 | yield someValue |
ThisExpression | this 关键字表达式,表示当前上下文的对象引用。 | this |
BinaryExpression / LogicalExpression | 二元逻辑/算术表达式,包含两个操作数和一个二元运算符(如+、-、*、&&、|| 等) | a + b , c > d && e < f |
Comment & Program
Comment(注释类)
类型(Type) | 描述 | 示例代码 |
---|---|---|
LineComment | 行内注释,以// 开始的单行注释。 | // This is a line comment. |
BlockComment | 块注释,以/* 开始并以*/ 结束的多行注释。 | /* This is a block comment. */ |
Program(程序类)
类型(Type) | 描述 | 示例代码 |
---|---|---|
Program | 整个 JavaScript 源文件或模块的内容。它包含一个或多个声明、表达式或其他语句,并且是 AST 的根节点。 | const x = 1; function myFunc() {...}; |
Directive | 特殊类型的语句,通常出现在脚本或模块顶部的"use strict" 等指令。在 AST 中,可能作为 Program 的一部分出现。 | 'use strict'; |
Module | ES6 模块相关的节点类型,代表整个模块的结构,其中包含导入和导出声明以及顶级定义。 | import { foo } from './module.js'; export default bar; |