我正在研究一个涉及检查@ babel / parser提供的AST的项目,并且在某个(非超罕见的)情况下,它的行为不像我预期的那样。这行Javascript:
const var1 = undefined;
当由此命令处理时:
babelParser.parse(data, {
plugins: [ `jsx`, `classProperties` ],
sourceType: `unambiguous`,
});
变成这个子树:
{
"type": "VariableDeclarator", // expected
"start": 240,
"end": 256,
"loc": {
"start": {
"line": 17,
"column": 4
},
"end": {
"line": 17,
"column": 20
}
},
"id": {
"type": "Identifier", // also expected
"start": 240,
"end": 244,
"loc": {
"start": {
"line": 17,
"column": 4
},
"end": {
"line": 17,
"column": 8
},
"identifierName": "var1"
},
"name": "var1"
},
"init": {
"type": "Identifier", // dang, really?
"start": 247,
"end": 256,
"loc": {
"start": {
"line": 17,
"column": 11
},
"end": {
"line": 17,
"column": 20
},
"identifierName": "undefined"
},
"name": "undefined"
}
}
为什么babel解析器将undefined
视为变量而不是“UndefinedLiteral”? (我的意思是,除了“UndefinedLiteral”似乎不是根据AST spec的事实)
有没有办法改变这个初始值节点的类型?或者我是否必须在我的代码中添加一个特殊情况来查找值为“undefined”的Identifier
s?
你不能因为undefined
不是JS语法中的特殊标记。这完全有效
var undefined = 4;
console.log(undefined); // logs 4
所以你需要检查一个名为Identifier
的undefined
,如果你想要小心,还要分析变量的范围,看看它是否真的是全局undefined
绑定,还是一个可能具有其他值的本地绑定。