先谈谈经历吧,今天debug js的时候发现了代码被混淆过了,但是由于比较关键,只能硬着头皮看了。
然后就看到非常经典的一行代码。
简化一下差不多是这个意思 return i && (expa,expb),expc;
这里比较痛苦的就是逗号操作符啥意思呀?和for循环或者调用参数相关的我们都很熟悉,但是单独用时什么意思呢?
百度果然是人类解决问题最好的方式:逗号操作符
这里面很关键的一句话:逗号操作符 对它的每个操作数求值(从左到右),并返回最后一个操作数的值。
相当于现在有个 expr1, expr2, expr3
然后先执行 expr1,然后执行expr2,最后执行expr3,并把expr3返回。
然而,我随便试了下,反正貌似不太对。
前面a和b的值不出我所料,说明先执行第一个表达式,后执行第二个表达式,但是为什么c=2呢?难道不应该返回第二个表达式的返回结果才对嘛?
百思不得解。
.
.
.
然而,一个无意的回眸,难道
=
和,
的优先级不同?=
不是最末尾的优先级?
通过运算符的优先级,我最终确定了,,
的优先级居然比=
还低,而且还是最末尾的。
那么 c= a=1,b=1;
可以转换成 (c= a =1),b=1
; ,所以c的返回值其实是1。
为了验证这个,我们可以这样做。
c = (a=1,b=1)
这样就完美了。