const fs = require("fs");//文件读写
const parse = require("@babel/parser"); //解析为ast
const traverse = require('@babel/traverse').default;//遍历节点
const t = require('@babel/types');//类型
const generator = require('@babel/generator').default;//ast解析为代码
const code = `
const a = !![]+!![]+!![];
const b = Math.floor(12.34 * 2.12)
const c = 10 >> 3 << 1
const d = String(21.3 + 14 * 1.32)
const e = parseInt("1.893" + "45.9088")
const f = parseFloat("23.2334" + "21.89112")
const g = 20 < 18 ? '未成年' : '成年'
const _0x34e16a = '3,4,0,5,1,2'['split'](',')
`
// 默认为 script,当代码中含有 import 、export 等关键字时会报错,需要指定为 module
const ast = parse.parse(code, {sourceType: "module"})
function replace_expression(path) {
// path.evaluate()直接执行js代码返回一个对象
// confident 置信度 value值
const {confident, value} = path.evaluate()
if (confident) {
path.replaceInline(t.valueToNode(value))
}
}
const visitor = {
"BinaryExpression|CallExpression|ConditionalExpression": {
enter: [replace_expression]
}
}
traverse(ast, visitor)
const result = generator(ast, {jsescOption: {"minimal": true}}).code
console.log(result)
var a = '3,4,0,5,1,2'['split'](',');
console.log(a)
备注:学习K哥AST的笔记