boolean 运算符得以让程序语言得以正常运行,因此它起到十分重要的作用。
boolean 运算符有三种:not、and 和 or。
在学习各种逻辑运算符之前,让我们先了解一下ecmascript-262 v5规范中描述的toboolean操作。
抽象操作toboolean将其参数按照下表中的规则转换为逻辑值:
参数类型 | 结果 |
---|---|
undefined | false |
null | false |
boolean | 结果等于输入的参数(不转换) |
number | 如果参数为 +0, -0 或 nan,则结果为 false;否则为 true。 |
string | 如果参数为空字符串,则结果为 false;否则为 true。 |
object | true |
在ecmascript中,逻辑not运算符与c和java中的逻辑not运算符相同,都由感叹号(!)表示。
与逻辑or和逻辑and运算符不同的是,逻辑not运算符返回的一定是boolean值。
逻辑not运算符的行为如下:
通常,该运算符用于控制循环:
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
在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值:
与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运算符时,必须记住它的这种简便计算特性。
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值:
与逻辑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); //不会执行这一行