本文详细解析JavaScript中逻辑与运算符(&&)的运算规则。除了返回布尔值外,当操作数非布尔类型时,运算符将返回具体的对象、null、NaN或undefined。重点介绍了短路运算机制:若第一个操作数决定结果,则不再计算第二个操作数,这能有效避免对未定义变量的访问错误。
JavaScript逻辑与运算符基础
在JavaScript语言中,逻辑与(Logical AND)运算符通过双和号(&&)来标识。
var bTrue = true;
var bFalse = false;
var bResult = bTrue && bFalse;
逻辑与运算符的具体行为可以通过以下真值表进行描述:

需要注意的是,逻辑与运算符的操作数可以是任意数据类型,而不仅仅是布尔值。因此,当操作数并非原始的布尔类型时,该运算符不一定返回布尔类型的结果。
逻辑与运算符的运算规则
逻辑与运算符的具体运算行为如下所示:
- 若其中一个操作数是对象,而另一个是布尔值,则运算符返回该对象。
- 若两个操作数均为对象,则返回第二个对象。
- 若其中一个操作数是 null,则返回 null。
- 若其中一个操作数是 NaN,则返回 NaN。
- 若其中一个操作数是 undefined,则程序会抛出错误。
- 若两个操作数均为布尔类型,则返回布尔值。
短路运算机制与示例
与Java中的逻辑与运算类似,JavaScript中的逻辑与运算也具备短路特性,即如果第一个操作数已经决定了最终结果,系统将不再计算第二个操作数。对于逻辑与运算而言,如果第一个操作数为 false,那么无论第二个操作数的值如何,最终结果都不可能为 true。 以下是一个示例代码:
var bTrue = true;
var bResult = (bTrue && bUnknown); //发生错误
alert(bResult); //这一行不会执行
上述代码的运行结果如下:

在该段代码执行逻辑与运算时,会引发错误,因为变量 bUnknown 处于未定义状态。由于变量 bTrue 的值为 true,逻辑与运算会继续计算变量 bUnknown。然而,因为 bUnknown 的值为 undefined,无法参与逻辑与运算,从而导致错误。 如果修改示例,将第一个操作数设置为 false,则不会发生错误:
var bTrue = false;
var bResult = (bTrue && bUnknown); //不会发生错误
alert("bTrue && bUnknown的结果是:"+(bResult));//输出 "false"
在这段代码中,脚本将输出逻辑与运算返回的值,即字符串 "false"。即使变量 bUnknown 的值为 undefined,它也不会被计算,因为第一个操作数的值已经是 false。
运行结果如下:

运算行为验证测试
验证JavaScript逻辑与运算符的运算行为
测试代码如下:
<script type="text/javascript">
document.write("验证JavaScript逻辑And运算符的运算行为:");
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
var bTrue = true;
var bFalse = false;
var bResult = bTrue && bFalse;
/*1.如果两个运算数都是boolean类型,则返回boolean值*/
document.write("1.如果两个运算数都是boolean类型,则返回boolean值");
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
document.write("bTrue = true,bFalse = false,bTrue && bFalse的结果是:"+(bResult));//结果为false
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
var obj = new Object();
/*2.如果一个运算数是对象,另一个是 Boolean 值,返回该对象*/
document.write("2.如果一个运算数是对象,另一个是 Boolean 值,返回该对象");
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
document.write("obj是一个对象,true&&obj的结果是:"+(true&&obj));
document.write("<br/>");
document.write("obj==true&&obj的结果是:"+(obj==(true&&obj)));
document.write("<br/>");
document.write("false&&obj的结果是:"+(false&&obj));
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
/*3.如果两个运算数都是对象,返回第二个对象。*/
var obj1 = new Object();
var obj2 = new Object();
document.write("3.如果两个运算数都是对象,返回第二个对象。");
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
document.write("obj1是一个对象,obj2是一个对象,obj1==(obj1&&obj2)的结果是:"+(obj1==(obj1&&obj2)));//结果为false
document.write("<br/>");
document.write("obj1是一个对象,obj2是一个对象,obj2==(obj1&&obj2)的结果是:"+(obj2==(obj1&&obj2)));//结果为true
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
/*4.如果某个运算数是 null,返回null。*/
var a=null;
var b=true;
document.write("4.如果某个运算数是 null,返回null。");
document.write("<br/>");
document.write("a=null,b=true,a&&b的结果是:"+(a&&b));
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
/*5.如果某个运算数是NaN,返回NaN*/
var c = NaN;
var d = "str";
document.write("5.如果某个运算数是NaN,返回NaN");
document.write("<br/>");
document.write("c=NaN,d=str,c&&d的结果是:"+(c&&d));
document.write("<br/>");
document.write("-----------------------------------------------------------------------------");
document.write("<br/>");
/*
6.JavaScript中的逻辑 AND 运算是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数。
对于逻辑 AND 运算来说,如果第一个运算数是 false,那么无论第二个运算数的值是什么,结果都不可能等于 true。
*/
var bFalse = false;
var bResult = (bFalse && bUnknown);
document.write("6.JavaScript中的逻辑 AND 运算是简便运算,即如果第一个运算数决定了结果,就不再计算第二个运算数");
document.write("<br/>");
document.write("对于逻辑 AND 运算来说,如果第一个运算数是 false,那么无论第二个运算数的值是什么,结果都不可能等于 true。");
document.write("<br/>");
document.write("bFalse=false,bUnknown是一个未定义的变量,bFalse && bUnknown的结果是:"+(bResult)); //输出 "false"
var bTrue = true;
var bResult = (bTrue && bUnknown); //发生错误
alert(bResult); //这一行不会执行
</script>

以上内容即为对JavaScript逻辑与运算符的完整介绍,希望能帮助读者更好地理解JavaScript中的逻辑运算符。