如何让@ babel / parser将'undefined'识别为特殊标记?

问题描述 投票:0回答:1

我正在研究一个涉及检查@ 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”的Identifiers?

javascript babeljs abstract-syntax-tree
1个回答
1
投票

你不能因为undefined不是JS语法中的特殊标记。这完全有效

var undefined = 4;
console.log(undefined); // logs 4

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

© www.soinside.com 2019 - 2024. All rights reserved.