抽象语法树(Abstract Syntax Tree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每一个节点都表示源代码中的一种结构。node
抽象语法树在不少领域有普遍的应用,好比浏览器,智能编辑器,编译器等。在JavaScript中,虽然咱们并不会经常与AST直接打交道,但却也会常常的涉及到它。例如使用UglifyJS来压缩代码,bable对代码进行转换,ts类型检查,语法高亮等,实际这背后就是在对JavaScript的抽象语法树进行操做。express
介绍前,请先打开 astexplorer.net/ 这个网址,这是个在线代码转化成AST工具。 输入简单的一行代码编程
var name = 'ast';
const names= ['zs', 'ls']
复制代码
输出结果为数组
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "name"
},
"init": {
"type": "Literal",
"value": "ast",
"raw": "'ast'"
}
}
],
"kind": "var"
},
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "names"
},
"init": {
"type": "ArrayExpression",
"elements": [
{
"type": "Literal",
"value": "zs",
"raw": "'zs'"
},
{
"type": "Literal",
"value": "ls",
"raw": "'ls'"
}
]
}
}
],
"kind": "const"
}
],
"sourceType": "module"
}
复制代码
在输入一个函数看看结果浏览器
function add(a,b){
return a+b;
}
复制代码
输出bash
{
"type": "Program",
"body": [
{
"type": "FunctionDeclaration",
"id": {
"type": "Identifier",
"name": "add"
},
"expression": false,
"generator": false,
"async": false,
"params": [
{
"type": "Identifier",
"name": "a"
},
{
"type": "Identifier",
"name": "b"
}
],
"body": {
"type": "BlockStatement",
"body": [
{
"type": "ReturnStatement",
"argument": {
"type": "BinaryExpression",
"left": {
"type": "Identifier",
"name": "a"
},
"operator": "+",
"right": {
"type": "Identifier",
"name": "b"
}
}
}
]
}
}
],
"sourceType": "module"
}
复制代码
这个比上面多了些类型babel
本节主要对AST有个大概认识,下节主要讲如何经过babel将代码转成AST在转成js代码。async