关注它,不迷路。
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!
1. 需求分析
如何通过AST解析后的代码观察运算符的优先级?如何确保还原不出错?
2. 实例分析1
将下面的代码拿到在线解析网站上分析:
1 + 2 + 3;
解析后的结果:
从上图可以看出,它把 "1 + 2 + 3" 解析成了 BinaryExpression 类型,而其左孩子节点 同样是一个 BinaryExpression 类型(1 + 2),右孩子节点是一个 NumericLiteral 类型(3)。等价于:
(1 + 2) + 3;
将代码变形一下,变成:
1 + 2 * 3;
解析后的结果:
从上图可以看出,它同样把 "1 + 2 * 3" 解析成了 BinaryExpression 类型,不同的是,左孩子节点变成了NumericLiteral 类型(1);而右孩子节点变成了 BinaryExpression 类型(2 * 3);等价于:
1 + (2 * 3);
由此可以推断出运算符 * 比 + 的优先级要高。
3. 实例分析2
再看下面的例子
zc(s === Sc || s === Ac ? 192 : 204);
通过解析后的AST来分析 "||" 与 "?" 的优先级谁的高?下面是解析后的代码:
从上面的解析可以看出,ConditionalExpression 类型的test子节点是
LogicalExpression 类型,这就说明了" || "的优先级比" ? "的要高.
即:
zc((s === Sc || s === Ac) ? 192 : 204);
我们可以反推,如果 "||" 比 "?" 的优先级低的话,应该解析成 :
zc(s === Sc || (s === Ac ? 192 : 204));
如下图:
这都已经不是 ConditionalExpression 类型了,因此可以判断出," || "的优先级比" ? "的要高。
今天的文章就分享到这里,后续分享更多的技巧,敬请期待。