JS运算符&&与||遵守短路原则讲解
1.&& -- 与
符号前面和后面都为true则返回true,但是有一方为false则返回false。那么下面的内容会输出什么呢?
alert(1&&1); alert(1&&0); alert(0&&0); alert(0&&1);前提是你要知道,0即false, 1or2即true;
2.|| -- 非
符号前面和后面任何一方为true则返回true,双方均为false则返回false。那么下面的内容会输出什么呢?
alert(1||1); alert(1||0); alert(0||0); alert(0||1);前提是你要知道,0即false, 1or2即true;
不留悬念了,输出的内容依次是1, 0, 0, 0, 1,1,0,1
让我们总结一下:
只要“||”前面为false,无论“||”后面是true还是false,结果都返回“||”后面的值。只要“||”前面为true,无论“||”后面是true还是false,结果都返回“||”前面的值。只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;
由上两个测试可知,逻辑运算符,“||”和“&&”都是遵行短路原则,只要确定符号前面的真假,既可确定返回值。
需要说明的是“&&”的优先级是高于“||”的,下面测试:
alert(1||'a'&&2);
返回结果是1。
根据反证原理,我们假设“||”的优先级不低于“&&”(这里只所以用“不低于”,是为了同时证明等级相同的情况)。
根据上面我们得出的结论(1),(1||'a')将返回前面的值1,(1&&2)根据结论(4)应该返回后面的值2。这显然不对,由此可知“&&”的优先级是高于“||”的。
敲知识点
&&的运算优先级大于 ||逻辑运算的短路特性:(表达式1)&&(表达式2) 如果表达式1为假,则表达式2不会进行运算,即表达式2“被短路”
(表达式1)||(表达式2) 如果表达式1为真,则表达式2不会进行运算,即表达式2“被短路”