逻辑运算分为两种,一种会改变目标数据类型,另一种则不会。前者的典型代表是逻辑非运算,无论运算元是什么类型,执行逻辑非运算后,都会被转化为bool值。例如:
var a = "123" ; var b = !a;
而另一种形式则不改变目标类型,且支持布尔短路,包括“逻辑与”(&&)和“逻辑或”(||)运算。所谓布尔短路,指的是指判断第一个运算元就决定运算结果,而不需要处理第二个运算元。具体运算规则如下:
第一个运算元为真时,逻辑或运算返回第一个运算元(注意,没有改变类型),逻辑与运算返回第二个运算元 第一个运算元为假时,逻辑或运算返回第二个运算元,逻辑与运算返回第一个运算元 我们来举几个特殊点的例子:
function and(a, b) { return a && b; } function or(a, b) { return a || b; } var a = and( "str" , false ); var b = or( "str" , false ); var c = and(0, "str2" ); var d = or(0, "str2" );
这种运算最常见的用法是处理实参。我们知道,JavaScript中的实参列表和形参列表可以长度不等,那么,如何处理不等的部分呢?我们举个例子:
function add(a, b) { return a + b; } var a = add(5);
结果是NaN,这明显不是我们想要的结果,我们更愿意它返回5。我们可以利用逻辑运算:
function add(a, b) { b = b || 0; return a + b; } var a = add(5); var b = add(5, 2);
如果形参长度大于实参长度,超过的部分将是undefined。而b = b || 0这句能在b为undefined(布尔值为false)的时候,把0赋给b,使得b仍然为数值类型,并参与运算。当然,这样处理还是很简陋的,比如当传入的b为非空字符串的时候,这个函数还是会出错,所以正确的做法应该是判断是不是数值类型,但在排除API使用者乱来的情况下,逻辑运算不失为一种好办法。