当前位置: 首页 > backend >正文

关于 ast: Babel AST 全类型总览

AST 的每个节点都有一个 type 字段,用来标识它的语法类型。

程序结构节点

type说明示例
Program整个程序的根节点整体代码结构
BlockStatement大括号代码块 {}if、function、for 等的主体
ExpressionStatement表达式语句(如 a + b;
EmptyStatement分号 ; 空语句

变量与赋值

type说明示例
VariableDeclaration变量声明(var/let/const)var a = 1;
VariableDeclarator声明项a = 1
AssignmentExpression赋值表达式a = b + 1
Identifier标识符(变量名)a
Literal字面量(数/字符串等)"abc", 123, true

函数定义与调用

type说明示例
FunctionDeclaration声明式函数function fn() {}
FunctionExpression表达式形式的函数var f = function() {}
ArrowFunctionExpression箭头函数()=>{}
CallExpression函数调用fn(arg1, arg2)
ReturnStatement返回语句return 123

运算表达式

type说明示例
BinaryExpression二元运算符a + b, x * y
LogicalExpression逻辑运算符(&&、
UnaryExpression一元运算(+a、-b、!x)!isLogin
UpdateExpression自增自减 ++ --i++, --x
AssignmentExpression赋值表达式a = b + 1
ConditionalExpression三元表达式 a ? b : c

对象与数组相关

type说明示例
ObjectExpression对象字面量{a:1, b:2}
Property对象的属性a:1
ArrayExpression数组字面量[1, 2, 3]
MemberExpression属性访问 obj.prop 或 obj["a"]obj.a, arr[0]

流程控制语句

type说明示例
IfStatementif 语句if (x) {}
SwitchStatementswitch 语句switch(x){}
SwitchCaseswitch 的 case 分支case 1:
WhileStatementwhile 循环while (true) {}
DoWhileStatementdo...while 循环do {} while (true)
ForStatementfor 循环for (let i=0;i<10;i++)
BreakStatementbreakbreak;
ContinueStatementcontinuecontinue;

全局对象 / 关键字

type说明示例
ThisExpressionthisthis.a
NewExpressionnew 表达式new Date()
SequenceExpression多个表达式用逗号隔开a = 1, b = 2
ThrowStatementthrow 抛出错误throw new Error("msg")
TryStatementtry-catch-finally 结构try { ... } catch (e) {}

特殊用途(混淆常用)

type说明示例
Eval(间接通过 CallExpression)用 eval 执行的内容会被解析为表达式树eval("var a = 1")
Function + Function()动态生成函数new Function("a", "b", "return a + b")
TemplateLiteral模板字符串(含 ${}`hello ${name}`
TaggedTemplateExpression标签模板(如 crypto 模板 tag 加密)taghello`

如何查看 type?

可以直接用 Babel 插件、AST Explorer 来查看节点类型:

工具推荐:

  •  AST Explorer

  •  Babel 插件 + traverse(ast, visitor) 打印 path.node.type

traverse(ast, {enter(path) {console.log(path.node.type);  // 输出每个节点的类型}
});
http://www.xdnf.cn/news/6029.html

相关文章:

  • 在Java中实现Parcelable接口和Serializable接口有什么区别?
  • trame实现双视图(返场版)
  • MySQL 日期计算方法 date_sub()、date_add()、datediff() 详解-文中有示例帮助理解
  • java基础-泛型
  • tails os系统详解
  • 实物工厂零件画图案例(上)
  • 进程与线程:09 进程同步与信号量
  • Linux的域名解析服务器
  • OAuth安全架构深度剖析:协议机制与攻防实践
  • 【Nacos】env NACOS_AUTH_IDENTITY_KEY must be set.
  • SparkSQL 连接 MySQL 并添加新数据:实战指南
  • uniapp+vue3中自动导入ref等依赖
  • 通义灵码2.5版本全新体验
  • CSP-J普及组第一轮真题单选题专项训练(二)
  • NumPy 2.x 完全指南【九】常量
  • 虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
  • 软件测试(2)软件测试分类及流程
  • 【自学30天掌握AI开发】 - 课程简介
  • Spring事务失效的全面剖析
  • C++:重载>>和<<(输入和输出运算符)
  • [FA1C4] 博客链接
  • OpenTiny icons——超轻量的CSS图标库,引领图标库新风向
  • Weblogic 反序列化远程命令执行漏洞 CVE-2019-2725 详解
  • Eaton XV-102-BE-35TQRC-10是伊顿(Eaton)公司推出的一款高性能触摸屏人机界面(HMI)
  • Python | Dashboard制作
  • 【报错解决】服务器重启后vscode远程连接失败
  • MySQL推荐书单:从入门到精通
  • 3545. 不同字符数量最多为 K 时的最少删除数
  • 【登录认证】JWT令牌
  • RDD-自定义分区器案例