昨天在审阅谭显英壮士提交的一个重要 DT 合并请求中的 JS 代码时,注意到这样一个 if 语句:
if ((flagSel && !flagRowSel) || (!flagSel && flagRowSel)) {
...
}
好家伙,这是传说中的圆环套圆环娱乐城咩。每当涉及到两个逻辑变量的比较操作时,我都会在纸上画一个表格,来看清楚到底在比什么。比如上例何时会是 true:
| flagRowSel | true | false | |
|---|---|---|---|
| flagSel | true | x | √ |
| false | √ | x |
这样就很清楚了:当 flagSel 和 flagRowSel 取值不同时,这个逻辑比较的结果便是 true。所以我们就可以把圆环套圆环娱乐城的墙拆了,简化为:
if (flagSel !== flagRowSel) {
...
}
说白了,这就是一个异或(XOR)的比较,而异或说白了其实也就是看两个逻辑变量是否相异(必须一个 true 一个 false 才能得到 true)。由于逻辑变量的特殊性,取值的可能性只有两个,那进一步简化就是:
function XOR(a, b) {
return a !== b;
}
最终我用的是 if (flagSel === flagRowSel),这里我事先把 flagRowSel 的取值反过来了,以使得它跟 flagSel 的意思相同,都代表 DT 表格中的一行是否没有被选中。感觉这样更通顺一些。
写代码跟说话一样,要是一串逆否条件,人就很容易晕掉。比如这样的表白神句:你是不是不承认你并不是没有喜欢我?
- 是?那你就是喜欢我喽!
- 不是?那你就是喜欢我喽!
战无不胜。
赞赏
作为一名没有固定工作的自由职业者,我非常感谢您通过捐赠的方式来支持我的写作和开源软件开发。当然,捐赠纯属自愿。无论金额多少,都是一片诚挚的心意。支付方式如下:
| 微信 | ← 奋力支开它俩 → | 支付宝 |
|---|---|---|
![]() |
其它爱心通道 ↓ Venmo: @yihui_xie Zelle: xie@yihui.name PayPal: xie@yihui.name |
![]() |
若使用 Venmo/Zelle/Paypal,请添加备注“gift”或“donation”,以免捐赠被视为我的可税收入。若使用 Paypal,支付类型请选 Family and Friends,而不要选 Goods and Services。
在不影响生活的前提下,我会将收到的捐赠以尽量大的比例回馈给开源社区和慈善机构。作为参考,2024-25 年间我共收到约三万美元捐赠,完税后我转手捐出了一万五千美元。

