作者:zccst
js运算符优先级也是一个巨大的坑。有时候你会被绕进去,例如:
var tpl = len > max && exceedTpl || defaultTpl;
按照我的理解,当len小于max时,第一个为假,后面又是&&,所以直接跳过执行下一行。
但实际是tpl等于defaultTpl。
测试用例:
3 > 5 && 'a' || 'b'; // 'b'
3 > 5 || 'a' && 'b'; // 'b'
解析: 3>5是false,与'a' &&,结果是false,继续执行表达式 ||,结果是'b'
3>5是false,与'a' ||,结果是true,由于后面是 && 必须执行,'b'也是true,最终结果是true,且返回 'b'。
5 > 3 && 'a' || 'b' ;//"a"
5 > 3 || 'a' && 'b' ;true
解析:
5 > 3 && 'a'为真,且后面是||,所以直接返回,不再计算。
5 > 3为真,且后面是||,所以直接返回,不再计算。
由于本例中,exceedTpl和defaultTpl始终为真。类似
3 > 5 && 'a' || 'b';或
5 > 3 && 'a' || 'b';
所以结果只有两种情况:前者是'b',后者是'a'
当最前面值相等的时候,大于仍然不成立,仍然结果是'b'
补充
3 > 5 || '' && 'b'; //''
5 > 3 && '' || 'b'; //"b"
因为3>5假,执行||,假,直接返回''
5>3为真,继续与''&&,结果为假,继续||,并返回||后面的值。
如果此时'b'是false,结果也返回false,即
5 > 3 && '' || false; //false
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
[img]http://dl2.iteye.com/upload/attachment/0109/0668/fb266dfa-95ca-3d09-b41e-5f04a19ba9a1.png[/img]
js运算符优先级也是一个巨大的坑。有时候你会被绕进去,例如:
var tpl = len > max && exceedTpl || defaultTpl;
按照我的理解,当len小于max时,第一个为假,后面又是&&,所以直接跳过执行下一行。
但实际是tpl等于defaultTpl。
测试用例:
3 > 5 && 'a' || 'b'; // 'b'
3 > 5 || 'a' && 'b'; // 'b'
解析: 3>5是false,与'a' &&,结果是false,继续执行表达式 ||,结果是'b'
3>5是false,与'a' ||,结果是true,由于后面是 && 必须执行,'b'也是true,最终结果是true,且返回 'b'。
5 > 3 && 'a' || 'b' ;//"a"
5 > 3 || 'a' && 'b' ;true
解析:
5 > 3 && 'a'为真,且后面是||,所以直接返回,不再计算。
5 > 3为真,且后面是||,所以直接返回,不再计算。
由于本例中,exceedTpl和defaultTpl始终为真。类似
3 > 5 && 'a' || 'b';或
5 > 3 && 'a' || 'b';
所以结果只有两种情况:前者是'b',后者是'a'
当最前面值相等的时候,大于仍然不成立,仍然结果是'b'
补充
3 > 5 || '' && 'b'; //''
5 > 3 && '' || 'b'; //"b"
因为3>5假,执行||,假,直接返回''
5>3为真,继续与''&&,结果为假,继续||,并返回||后面的值。
如果此时'b'是false,结果也返回false,即
5 > 3 && '' || false; //false
如果您觉得本文的内容对您的学习有所帮助,您可以微信:
[img]http://dl2.iteye.com/upload/attachment/0109/0668/fb266dfa-95ca-3d09-b41e-5f04a19ba9a1.png[/img]