学习笔记|复杂嵌套的三目表达式如何分割?
下面的这段代码是从某前端的混淆代码里复制下来的,略有修改:
2 == r ? o = 0 : 2 > r ? 0 == r ? o = c ? 3 : 24 : r > 0 && (o = void 0) : 3 == r ? o = 8 : r > 3 && (c = c[p],o = 16)
代码很简短,但是足够让人头皮发麻,不知道该如何分析。
有些朋友可能不知道什么是三目表达式,某百科解析的非常清楚:
-
三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。
-
它是唯一有3个操作数的运算符,有时又称为三元运算符。
-
一般来说,三目运算符的结合性是右结合的。
以及其定义:
-
对于条件表达式b ? x : y,先计算条件b,然后进行判断。
-
如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。
-
一个条件表达式绝不会既计算x,又计算y。
-
条件运算符是右结合的,也就是说,从右向左分组计算。
-
例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。
简单的解读下就是,三元运算符是 "?:" ,? 后面必定会跟一个 : 。
而对于上面的混淆代码,?后面连续跟了好几个?,这就让人有点懵逼了。
其实很简单,我们把"?" 和 ":" 当成一个整体就行了。换句话说,当你遍历到一个?的时候,需要找到与之匹配的 : ,然后把 ? 和与之匹配的 : 之间的代码看成一个整体,把 : 后面的代码看成一个整体 。
那如何找到 与当前的? 匹配的 : ?
其实很简单,有点类似于 括号匹配,在 leetcode上面的难度级别是 简单。
简单的思路:
定义一个stack,用于存放 ? 和 : 的差值,个数为0时,则说明找到了匹配的 :,直接break;
如果检测到?,stack += 1;
如果检测到:,则stack -= 1;
其它字符继续检测,直到遍历结束
如果 是嵌套的三目表达式,则按上面的方法继续遍历 consequent 和 alternate 分支。
从上面的思路来看,它是一个递归算法,退出条件是当前代码段中不包含? 字符。
也许你有个疑问,如果到当前代码段中包含字符串,而该字符串恰好包含?字符,那就错乱了。
想要通用,则需要加另外的判断了,本文不做延伸,感谢阅读。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/120030727
- 点赞
- 收藏
- 关注作者
评论(0)