如何让@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

所以你需要检查一个叫做 undefinedIdentifier,如果你想小心一点,还要分析变量的范围,看看它是否真的是全局的 undefined 绑定,或可能具有其他值的本地绑定。