如何让@babel/parser 将'undefined' 识别为特殊标记?
how do I get @babel/parser to recognize 'undefined' as a special token?
我正在从事一个项目,该项目涉及检查@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
?
你不能,因为 undefined
不是 JS 语法中的特殊标记。这样做是完全有效的
var undefined = 4;
console.log(undefined); // logs 4
所以你需要检查一个叫做 undefined
的 Identifier
,如果你想小心一点,还要分析变量的范围,看看它是否真的是全局的 undefined
绑定,或可能具有其他值的本地绑定。
我正在从事一个项目,该项目涉及检查@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
?
你不能,因为 undefined
不是 JS 语法中的特殊标记。这样做是完全有效的
var undefined = 4;
console.log(undefined); // logs 4
所以你需要检查一个叫做 undefined
的 Identifier
,如果你想小心一点,还要分析变量的范围,看看它是否真的是全局的 undefined
绑定,或可能具有其他值的本地绑定。