假设看到了这样的代码:javascript
if (a && d || b && c && !d || (!a || !b) && c) {
console.log('pass')
} else {
console.log('fail')
}
复制代码
你是否一口老血喷在屏幕上?java
固然,这段代码是我参考一个沸点(@隔壁村的李二狗)伪造的,希望你和你的同事都别这么写。canvas
能写出这种与或非,若是不是逻辑不清,那么估计只有一种可能,需求变动不少次,多人修改后的结果。。微信
如今的问题是,面对如此代码,这么复杂的逻辑,可否优化?优化
答案是确定的!动画
这种问题的探究来自于一门数学:布尔代数或逻辑代数。ui
说到布尔,咱们开发者对此太熟悉了。不就是 true 和 false 嘛。spa
布尔代数这门课,大学里应该或多或少都讲些吧。由于我是数学专业毕业的,看到这种问题必须记录一下,也顺便复习一下。code
为了方便表达,JS中的与或非,我用布尔代数里面的表示方法(感谢掘金支持latex公式):cdn
所以 a && d || b && c && !d || (!a || !b) && c 能够表达为:
转化后优先级清晰多了。
如今的问题是,咱们如何化简这个逻辑表达式。
还好有一些经常使用结论可供咱们使用:
前四个公式很好理解。好比,本身或上本身否,固然为 true。
关键在于第5个公式没那么直观,能够经过画图简单说明下(其余公式均可以相似推导)。
首先看部分,如图中绿色区域:
再看,如图中绿色区域:
则两者之和为:
而部分正是图中粉色区域:
由于粉色区域本来就在前两者之和里面,所以加多少次都是同样的。
注意最后这个公式核心特色:和
是以和出现的。
有了这几个公式做为铺垫,咱们就能够正式推导了(原沸点配图中有):
根据第4条,替换最后一项:
注意到前两项分别有和
,符合第5条:
此时最后两项,符合第2条:
最后两项知足第3条:
至此化简完了。真是不能够思议,B没了!
此时开篇的代码简化成了这样:
if (a && d || c) {
console.log('pass')
} else {
console.log('fail')
}
复制代码
真清爽。
感谢你看到这里,但愿有所帮助。
今年年底,本人立了个flag,2020年要研究透canvas动画技术。
图中二维码是个人惟一微信号,若有掘友想加的,麻烦备注下来源哈,好比【掘金】。
本文完。