学习笔记|复杂嵌套的三目表达式如何分割?

下面的这段代码是从某前端的混淆代码里复制下来的,略有修改:

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上面的难度级别是 简单

简单的思路:

  1. 定义一个stack,用于存放  ? 和 : 的差值,个数为0时,则说明找到了匹配的 :,直接break;

  2. 如果检测到?,stack += 1;

  3. 如果检测到:,则stack -= 1;

  4. 其它字符继续检测,直到遍历结束

  5. 如果 是嵌套的三目表达式,则按上面的方法继续遍历 consequent 和 alternate 分支。

从上面的思路来看,它是一个递归算法,退出条件是当前代码段中不包含? 字符。

也许你有个疑问,如果到当前代码段中包含字符串,而该字符串恰好包含?字符,那就错乱了。

想要通用,则需要加另外的判断了,本文不做延伸,感谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值