日期:2014-05-16  浏览次数:20434 次

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


var a="1" && true && 0 && false && "abc";
alert(a);  //可见a的值是0
var b="abc" && true && "123";
alert(b);  //可见b的值是"123";
(2)或操作符(||)
和与操作符类似,或操作符的执行过程如下:javascript依次获取每一个操作数,将它们转换为布尔变量,如果是true,则直接返回这个操作数的值,中断后面操作数的处理;否则继续下一个操作数。如果知道最后一个操作数仍然对应布尔变量false,则返回这个操作数的值。下面的代码演示了其执行原理:

var a="abc" || "123";
alert(a);  //可见a的值是"abc"
var b=false || "" || 0;
alert(b);  //可见a的值是0
或操作符的这一性质在开发中经常会用到。
(3)非操作符(!)
和前两种操作符不同,非操作符始终返回布尔类型的变量,例如:

var a=! "abc";
alert(a);  //显示a的值为false

<II>
在JScript的众多运算符里,提供了三个逻辑运算符&&、||和!。按我们对逻辑运算的正常认识,逻辑运算的结果因该是ture或者false。但是JS的逻辑运算却不完全是这么定义的,这里只有!运算符总是返回true或false,而||和&&运算比较特别。

    JScript对于逻辑运算的true|false是这么定义的:
所有对象都被认为是 true。
字符串当且仅当为空(""或'')时才被认为是 false。
null 和未定义的均被认为是 false。
数字当且仅当为 0 时才是 false。
    注意:虽然if(null)不会被执行,但是(null==false)的运算结果为false,因为解析器认为是一个无意义的null对象和false做比较运算,根据上面第一条,对象都被认为是true,因此结果是false。

    可是逻辑运算符||和&&虽然遵循上面的定义规则,但是它们返回的值却很有意思。
    对于&&运算,按照上面的规则,表达式 if ( 'abc' && '123' && new Date() ) 是执行true分支,可是这个表达式如果写成:

var value = 'abc' && '123' && new Date();
    结果value=Fri Jan 21 00:01:17 UTC+0800 2005,因为执行顺序从左到右,如果到了最后一个表达式也是为true的,就返回那个表达式。

    对于||运算同理,对于下面的表达式:

var value1 = 'abc' || '123' || null || false;
var value2 = null || '' || false || 'ok';
    结果value1='abc',value2='ok'。注意"||"是短路"或",即:遇到第一个true时就立即返回。
    这样的特性可以帮组我们写出精简的代码,可是同时也带来代码不便于阅读维护的问题。



---★ 本文转摘自『IT学习者』→ http://www.itlearner.com/article/3084