ECMAScript Boolean 运算符
Boolean 运算符得以让程序语言得以正常运行,因此它起到十分重要的作用。
Boolean 运算符有三种:NOT、AND 和 OR。
ToBoolean 操作
在学习各种逻辑运算符之前,让我们先了解一下ECMAScript-262 v5规范中描述的ToBoolean操作。
抽象操作ToBoolean将其参数按照下表中的规则转换为逻辑值:
参数类型 | 结果 |
---|---|
Undefined | false |
Null | false |
Boolean | 结果等于输入的参数(不转换) |
Number | 如果参数为 +0, -0 或 NaN,则结果为 false;否则为 true。 |
String | 如果参数为空字符串,则结果为 false;否则为 true。 |
Object | true |
逻辑 NOT 运算符
在ECMAScript中,逻辑NOT运算符与C和Java中的逻辑NOT运算符相同,都由感叹号(!)表示。
与逻辑OR和逻辑AND运算符不同的是,逻辑NOT运算符返回的一定是Boolean值。
逻辑NOT运算符的行为如下:
- 如果运算数是对象,返回false
- 如果运算数是数字0,返回true
- 如果运算数是0以外的任何数字,返回false
- 如果运算数是null,返回true
- 如果运算数是NaN,返回true
- 如果运算数是undefined,发生错误
通常,该运算符用于控制循环:
var bFound = false;
var i = 0;
while (!bFound)
{
if (aValue[i] == vSearchValues) {
bFound = true;
} else {
i++;
}
}
在这个例子中,Boolean变量(bFound)用于记录检索是否成功。找到问题中的数据项时,bFound将被设置为true,!bFound将等于false,意味着运行将跳出while 循环。
判断ECMAScript变量的Boolean值时,也可以使用逻辑NOT运算符。这样做需要在一行代码中使用两个NOT运算符。无论运算数是什么类型,第一个NOT运算符返回Boolean值。第二个NOT将对该Boolean值求负,从而给出变量真正的Boolean值。
var bFalse = false;
var sRed = "red";
var iZero = 0;
var iThreeFourFive = 345;
var oObject = new Object;
document.write("bFalse 的逻辑值是 " + (!!bFalse));
document.write("sRed 的逻辑值是 " + (!!sRed));
document.write("iZero 的逻辑值是 " + (!!iZero));
document.write("iThreeFourFive 的逻辑值是 " + (!!iThreeFourFive));
document.write("oObject 的逻辑值是 " + (!!oObject));
结果:
bFalse 的逻辑值是 false
sRed 的逻辑值是 true
iZero 的逻辑值是 false
iThreeFourFive 的逻辑值是 true
oObject 的逻辑值是 true
逻辑 AND 运算符
在ECMAScript中,逻辑AND运算符用双和号(&&)表示:
例如:
var bTrue = true;
var bFalse = false;
var bResult = bTrue && bFalse;
下面的真值表描述了逻辑AND运算符的行为:
运算数 1 | 运算数 2 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。
如果某个运算数不是原始的Boolean型值,逻辑AND运算并不一定返回Boolean值:
- 如果第一个运算数是对象,第二个是Boolean值,返回第一个对象。
- 如果两个运算数都是对象,返回第二个对象。
- 如果某个运算数是null,返回null。
- 如果某个运算数是NaN,返回NaN。
- 如果某个运算数是undefined,发生错误。
与Java中的逻辑AND运算相似,ECMAScript中的逻辑AND运算也是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数。对于逻辑AND运算来说,如果第一个运算数是false,那么无论第二个运算数的值是什么,结果都不可能等于true。
考虑下面的例子:
var bTrue = true;
var bResult = (bTrue && bUnknown); //发生错误
alert(bResult); //这一行不会执行
这段代码在进行逻辑AND运算时将引发错误,因为变量bUnknown是未定义的。变量bTrue的值为true,因为逻辑AND运算将继续计算变量bUnknown。这样做就会引发错误,因为bUnknown的值是undefined,不能用于逻辑AND运算。
如果修改这个例子,把第一个数设为false,那么就不会发生错误:
var bFalse = false;
var bResult = (bFalse && bUnknown);
alert(bResult); //输出 "false"
在这段代码中,脚本将输出逻辑AND运算返回的值,即字符串"false"。即使变量bUnknown的值为undefined,它也不会被计算,因为第一个运算数的值是false。
提示:在使用逻辑AND运算符时,必须记住它的这种简便计算特性。
逻辑 OR 运算符
ECMAScript中的逻辑OR运算符与Java中的相同,都由双竖线(||)表示:
var bTrue = true;
var bFalse = false;
var bResult = bTrue || bFalse;
下面的真值表描述了逻辑OR运算符的行为:
运算数 1 | 运算数 2 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
与逻辑AND运算符相似,如果某个运算数不是Boolean值,逻辑OR运算并不一定返回Boolean值:
- 如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象。
- 如果两个运算数都是对象,返回第一个对象。
- 如果最后一个运算数是null,并且其他运算数值均为false,则返回null。
- 如果最后一个运算数是NaN,并且其他运算数值均为false,则返回NaN。
- 如果某个运算数是undefined,发生错误。
与逻辑AND运算符一样,逻辑OR运算也是简便运算。对于逻辑OR运算符来说,如果第一个运算数值为true,就不再计算第二个运算数。
例如:
var bTrue = true;
var bResult = (bTrue || bUnknown);
alert(bResult); //输出 "true"
与前面的例子相同,变量bUnknown是未定义的。不过,由于变量bTrue的值为true,bUnknown不会被计算,因此输出的是"true"。
如果把bTrue改为false,将发生错误:
var bFalse = false;
var bResult = (bFalse || bUnknown); //发生错误
alert(bResult); //不会执行这一行