“||”与“&&”的基础介绍
a||b “||”运算符先计算a,a的值转换为布尔值为true,“||”运算符就会直接返回a的值作为返回值,不会计算b的值(短路),当a转换为布尔值为false的时候才会直接返回b的值作为“||”运算符的返回值。
a&&b 在运算符“&&”中,如果a的值转换为布尔值为false,就会直接返回a的值作为“&&”运算符的返回值(短路),如果a的值转换为布尔值为true,才会返回b的值作为“&&”运算符的返回值。
那么“||”与“&&”的优先级究竟是谁高?
根据Mozilla 开发者社区(MDN)的技术文档
6 | 逻辑与 | 从左到右 | … && … |
5 | 逻辑或 | 从左到右 | … || … |
“&&”的优先级为6,“||”的优先级为5。所以按照技术文旦来看在一个出现“&&”与“||”的表达式中“||”的优先级是低的。
但是“&&”与“||”的优先级比较真的是这样的吗?
先来看一下
let a=true,b=false,c=false;
console.log(a||b&&c);
按照技术文档说的这个语句先计算b&&c,返回false,然后在计算a||false,最后返回结果true。嗯这样看文档说的优先级好像是没错,但是我们继续往下看。
let a=true,b=false,c=false;
console.log(a||(a=3||c)&&(b=2));
思考一下,这段语句执行结果又会返回什么?
按照文档来 首先计算(a=3||c)&&(b=2)部分,然后计算a=3||c部分,然后计算a=3,所以就相当于计算a||(a=3)&&(b=2),在计算进一步简化就是a||b=2,最后返回a的值,也就是3。
但是正确的返回值却是true。
为什么呢?
因为表达式a||(a=3||c)&&(b=2)直接计算了运算符“||”,直接返回了a的true值,短路了后面的操作。
这里可以看出运算符“&&”优先级并没有比“||”高。
然后再继续看
console.log(0&&4||1);
结果返回的是1,如果“||”比“&&”优先那么返回的结果会是0;
所以从以上的例子看来,“||”与“&&”并没有比对方优先级高,所以js中“||”与“&&”优先级为平级。
个人原创 转载声明