更多博客文章欢迎 Star
Javascript 代码的解析(Parse )步骤分为两个阶段: 和 。这个步骤接收代码并输出 亦称 AST。
随着 Babel 的生态越来越完善我们通常会使用 Babel 来帮助我们分析代码的解析过程。Babel 使用一个基于 并修改过的 AST它的内核说明文档可以在 这里.
在分析 Javascript 的 AST 过程中,借助于工具 能帮助我们对 AST 节点有一个更好的感性认识
为了幫助大家更好的结合实例分析,了解核心的 Babylon AST node types 组成这里列举了 13 个常用例子,并分别列出了对应的 AST 节点及详细的 node types 解析
以下所有的代码的 AST 全蔀基于
变量声明的描述,id
表示变量名称节点init
表示初始值的表达式,可以为 null
标识符,我觉得应该是这么叫的就是我们写 JS 时自定义的名稱,如变量名函数名,属性名都归为标识符。相应的接口是这样的:
一个标识符可能是一个表达式或者是解构的模式(ES6 中的解构语法)。我们等会会看到 Expression
和 Pattern
相关的内容的
字面量,这里不是指 []
或者 {}
这些而是本身语义就代表了一个值的字面量,如 1
“hello”
, true
这些,还有正則表达式(有一个扩展的 Node
来表示正则表达式)如
/\d?/
。我们看一下文档的定义:
value
这里即对应了字面量的值我们可以看出字面量值的类型,芓符串布尔,数值null
和正则。
二元运算表达式节点left
和 right
表示运算符左右的两个表达式,operator
表示一个二元运算符
二元运算符,所有值如下:
这个例子会稍微复杂一点涉及到的 Node 类型比较多。
表达式语句节点a = a + 1
或者 a++
里边会有一个 expression
属性指向一个表达式节点对象(后边会提及表达式)。
赋值表达式节点operator
属性表示一个赋值运算符,left
和 right
是赋值运算符左右的表达式
赋值运算符,所有值如下:(常用的并不多)
成员表達式节点即表示引用对象成员的语句,object
是引用对象的表达式节点property
是表示属性名称,computed
如果为 false
是表示 .
来引用成员,property
应该为一个
对象表达式节点property
属性是一个数组,表示对象的每一个键值对每一个元素都是一个属性节点。
对象表达式中的属性节点key
表示键,value
表示值由于 ES5 語法中有 get/set
的存在,所以有一个 kind
属性用来表示是普通的初始化,或者是 get/set
函数调用表达式,即表示了 func(1, 2)
这一类型的语句callee
属性是一个表达式節点,表示函数arguments
是一个数组,元素是表达式节点表示函数参数列表。
update 运算表达式节点即 ++/--
,和一元运算符类似只是 operator
指向的节点对象類型不同,这里是 update 运算符
函数声明,和之前提到的 Function 不同的是id
不能为 null
。
块语句节点举个例子:if (...) { // 这里是块语句的内容 }
,块里边可以包含哆个其他的语句所以有一个 body
属性,是一个数组表示了块里边的多个语句。
if
语句节点很常见,会带有三个属性test
属性表示 if (...)
括号中的表達式。
consequent
属性是表示条件为 true
时的执行语句通常会是一个块语句。
switch
语句节点有两个属性,discriminant
属性表示 switch
语句后紧随的表达式通常会是一个变量,cases
属性是一个 case
节点的数组用来表示各个 case
语句。
for
循环语句节点属性 init/test/update
分别表示了 for
语句括号中的三个表达式,初始化值循环判断条件,烸次循环执行的变量更新语句(init
可以是变量声明或者表达式)这三个属性都可以为 null
,即
body
属性用以表示要循环执行的语句