逻辑运算符

逻辑运算符包括:逻辑与运算符(&&)、逻辑或运算符(||)、逻辑非运算符(!)。

一、 逻辑与运算符(&&)  
逻辑与运算符(&&)的逻辑解析:
首先,计算第1个运算符,即左侧表达式。如果左侧表达式的计算值可以转换为false(如null、0、undefined等),那么就会结束计算,直接返回第1个运算值。
然后,当第一个运算数的值为true时,则将计算第2个运算数的值,即位于右侧的表达式,并返回这个表达式的值。

下面介绍几种特殊运算数应用技巧: 
示例1:
对象被转换为布尔值时为true。

alert(typeof({} && true))  // 返回第二个运算数true的类型,即返回boolean
alert(typeof({} && false)) // 返回第二个运算数false的类型,即返回boolean
alert(typeof(true && {}))  // 返回第二个运算数{}的类型,即返回object
alert(typeof(false && {})) // 返回第一个运算数false的类型,即返回boolean

示例2:
如果运算中包含null,则返回值总是null。

alert(typeof("null" && null)) 	// 返回null的类型,即返回object
alert(typeof(null && "null"))	// 返回null的类型,即返回object

示例3:
如果运算中包含NaN,,则返回值总是NaN。

alert(typeof("NaN" && NaN)) 	// 返回NaN的类型,即返回number
alert(typeof(NaN && "NaN"))	// 返回NaN的类型,即返回number

示例4:
对于Infinity特殊值来说,将被转换为true。

alert(typeof("Infinity" && Infinity)) 
	// 返回第二个运算数Infinity的类型,即返回number
alert(typeof(Infinity && "Infinity"))
	// 返回第二个运算数"Infinity"的类型,即返回string

示例5:
如果运算中包含undefined,则返回错误。

alert(typeof("undefined" && undefined))
alert(typeof(undefined && "undefined"))


二、逻辑或运算符(||)
逻辑或运算符(||)  的逻辑解析:  
首先,计算第1个运算数。如果左侧的表达式的计算值可以转换为true,那么直接返回第1个运算数的值,忽略第2个运算数(即不执行)。
然后,当第1个运算数的值为false时,则将计算的第2个运算的值,即位于右侧的表达式,并返回这个表达式的值。

var n = 3;
(n == 1) && alert(1);
(n == 2) && alert(2);
(n == 3) && alert(3);
( ! n) && alert("null");

等同于:

var n = 3;
(n == 1) && alert(1)||(n == 2) && alert(2)||(n == 3) && 
alert(3)||( ! n) && alert("null");

逻辑或运算和逻辑与运算时两个互为反的操作,对于null、NaN特殊值都返回相应的null、NaN,而对于undefined则返回错误。

 三、逻辑非运算符(!)  
逻辑非运算符是一元运算符,直接放在运算数之前,将对运算数执行布尔取反操作,并返回布尔值。

示例:下面列举一些特殊的运算数的逻辑非运算返回值。

alert( ! {}); 		// 返回false。如果运算数是对象,则返回false
alert( ! 0); 		// 返回true。如果运算数是0,则返回true
alert( ! (n = 5)); 	// 返回false。如果运算数是非0的任何数字,则返回false
alert( ! null); 	// 返回true。如果运算数是null,则返回true
alert( ! NaN); 		// 返回true。如果运算数是NaN,则返回false
alert( ! Infinity); 	// 返回false。如果运算数是Infinity,则返回false
alert( ! ( - Infinity)); 
//返回false。如果运算数是-Infinity,则返回false
alert( ! undefined); 
//返回true。如果运算数是undefined,则返回true,在早期浏览器中或发生错误

四、小示例:

var a; 										 
                                        // 定义变量a
alert(a = 6 && (b = function(){		// 逻辑与运算表达式
   return a; 								 
                                        // 返回变量a的值
})()
); 											 
                                        // 结果返回undefined

在上面这个复杂的表达式中,逻辑与左侧的运算数是一个赋值表达式,右侧的运算数也是一个赋值表达式。但是左侧仅是一个简单的数值赋值,而右侧的是把一个函数对象赋值给了变量b。在逻辑与运算中,左侧的赋值并没有真正的复制给变量a,当逻辑与运算执行右侧的表达式时,该表达式是把一个函数赋值给变量b,然后利用小括号运算符调用这个函数,返回变量a的值,结果并没有返回变量a的值为6,而是undefined。

上一篇: javaScript n++与++n的区别
下一篇: 真的爱过
作者邮箱: 203328517@qq.com