[转]JavaScript逻辑运算符及优先级

avascript真假值
   所有为假的值:false, null, 数字 0,  字符串 '',  数字NaN,undefined
   其它所有的值都被当作真值,包括字符串'false',true,以及对象。

 

Or similarly:

// If username is null, undefined, false, 0, "", or NaN, give it a new value

if (!username) username = "John Doe";

 

The return statement can also be used without an expression to make the function

return undefined to its caller. For example:

function display_object(o) {

    // Return immediately if the argument is null or undefined.

    if (!o) return;

    // Rest of function goes here...

}

 

JavaScript逻辑运算符及优先级
a && b ,如果 a 为true,直接返回b,而不管b为true或者false 。如果 a 为false 那么直接返回a
a || b ,如果 a 为true,直接返回a,而不会继续往下执行。如果 a 为false,直接返回b,而不管b为true或者false 。

 

例1:

今天看了一段YUI compressor压缩的js代码:

Java代码    收藏代码
  1. userNum && (ind += index,ind >= userNum && (ind -= userNum),ind < 0 && (ind === -2 && (ind = -1),ind += userNum),selLi.removeClass("on"),$(selLi[ind]).addClass("on"));  

 
直接疯掉了,估计一下子没几个人能看懂。那么就把他“翻译”一下。
&& (逻辑与)
这里主要是一个“&&”运算,首先要搞懂这个,看一个简单的例子:

Java代码    收藏代码
  1. var a = 1 && 2 && 3;//3  
  2. var b = 0 && 1 && 2;//0  
  3. var c = 1 && 0  && 2;//0  
  4. alert(a),alert(b),alert(c);  

 嘿嘿,写法很奇怪,运行的结果是3,0,0。一般我们在if语句中经常用到。“&&” (逻辑与) 运算和“||”运算真好相反,“&&” 运算遇到false就返回。
例如: a && b ,如果 a 为true,直接返回b,而不管b为true或者false 。如果 a 为false 那么直接返回a,上面例子中第一个var a = 1 && 2 && 3;因为1 && 2,1为真,返回2;2&&3, 2为真,返回3 。

Java代码    收藏代码
  1. var a = 0 || 1 || 2;//1  
  2. var b = 1 || 0 || 3;//1  
  3. alert(a),alert(b);  

 

搞懂了“&&” 运算,再来看最上的面的YUI compressor压缩的js代码,翻译一下:

Java代码    收藏代码
  1. if(userNum){  
  2.   ind += index;  
  3.   if (ind >= userNum) {  
  4.     ind -= userNum  
  5.   }  
  6.   if(ind < 0){  
  7.     if(ind === -2){  
  8.        ind = -1;  
  9.     }  
  10.     ind += userNum;  
  11.   }  
  12.   selLi.removeClass("on");  
  13.   $(selLi[ind]).addClass("on");  
  14. }  

 

 && (逻辑与) 和||(逻辑或)混合使用的时候要注意他们的优先级:
&& (逻辑与) 优先级高于||(逻辑或)


return a && b || c ,
根据a来判断返回值,a 是 false 则肯定返回 c;如果 b , c 都是 true ,那么我们就可以根据 a 来决定b 还是 c ,如果 a 是 false 则返回 c,如果a是true 则返回 b。
return a || b && c
根据优先级相当于先算 b && c ,然后和a 相 或;如果a是true,则返回a,不论是b或c,如果a是false,则如果b是false,返回b,如果b是true,返回c;

Java代码    收藏代码
  1. var a = 3  &&  0 || 2;  //2   
  2. var b = 3 || 0  &&  2// 3   
  3. var c= 0 || 2 && 3// 3  
  4. alert(a),alert(b),alert(c);  

 本例来源:http://www.css88.com/archives/3770

 

例2:

每个逻辑表达式都是有返回值的,但这个值并不一定是布尔变量,下面分别介绍:
(1)与操作符(&&)
javascript依次获取每一个操作数,将它们转换为布尔变量,如果是false,则直接返回这个操作数的值(注意,返回的是转换前的原值,不一定是布尔类型),中断后面操作数的处理;否则继续处理下一个操作数。如果直到最后一个操作数仍然对应布尔变量true,则返回最后这个操作数的值,下面的代码演示了其执行原理:

Java代码    收藏代码
  1. var a="1" && true && 0 && false && "abc";  
  2. alert(a);  //可见a的值是0  
  3. var b="abc" && true && "123";  
  4. alert(b);  //可见b的值是"123";  

 
(2)或操作符(||)
javascript依次获取每一个操作数,将它们转换为布尔变量,如果是true,则直接返回这个操作数的值,中断后面操作数的处理;否则继续下一个操作数。如果知道最后一个操作数仍然对应布尔变量false,则返回这个操作数的值。下面的代码演示了其执行原理:

Java代码    收藏代码
  1. var a="abc" || "123";  
  2. alert(a);  //可见a的值是"abc"  
  3. var b=false || "" || 0;  
  4. alert(b);  //可见a的值是0  

 
(3)非操作符(!)
和前两种操作符不同,非操作符始终返回布尔类型的变量 ,例如:

Java代码    收藏代码
  1. var a=! "abc";  
  2. alert(a);  //显示a的值为false  

 本例来源:http://www.itlearner.com/article/3084

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值