2-15 逻辑运算符
逻辑运算对于一门编程语言至关重要,它是分支和循环结构的基础,ECMAScript中支持的逻辑运算有3种:逻辑与运算、逻辑或运算和逻辑非运算。
ECMAScript中使用符号“&&”进行逻辑与运算。逻辑运算通常在两个布尔类型的操作数之间进行,“与”运算需要遵守表2-3所示的运算规则。
表2-3 “与”运算符的运算规则
上面的运算规则可以简要概述为:进行逻辑与运算的两个操作数都为true,结果才为true,只要有一个操作数为false,结果就为false。
在有些强类型的编程语言中,逻辑运算符只能在布尔值之间进行运算,在ECMAScript中,逻辑运算的操作数可以是任意类型的,并且其运算结果也不一定是布尔类型的值,规定如下:
(1)在两个对象间进行逻辑与运算,结果将返回第二个对象。
(2)在进行逻辑与运算的两个操作数中,如果有一个操作数为null,则结果为null。
(3)在进行逻辑与运算的两个操作数中,如果有一个操作数为NaN,则结果为NaN。
(4)在进行逻辑与运算的两个操作数中,如果有一个操作数为undefined,则结果为undefined。
示例代码如下:
下面来看一个十分有趣的小例子:
你能猜出上面代码中的console.log(v1)与console.log(v3)分别会打印出什么样的结果吗?
结果是console.log(v1)将打印出11,而console.log(v3)将打印出10。
对上面的结果是不是有些意外?其实很多编程语言在处理逻辑运算时都有这样一种法则:如果第一个操作数已经可以确定此表达式的结果,则不会再执行第二个操作数。从上面的代码来看,v4为false时,已经可以确定此与运算结果为false,因此v3++将不会被执行到。
ECMAScript中使用符号“||”进行逻辑或运算。逻辑或运算遵守表2-4所示的运算规则。
表2-4 “||”运算符的运算规则
和逻辑与运算一样,ECMAScript中的逻辑或运算也不一定会返回逻辑值。规定如下:
(1)如果有一个操作数为对象,当对象为第1个操作数时,结果为对象本身;当对象为第2个操作数时,如果第1个操作数为false,则结果为对象本身,如果第1个操作数为true,则结果为true。
(2)如果两个操作数都为对象,则返回第一个操作数。
示例代码如下:
因此,在进行逻辑或运算时,如果第一个操作数已经可以决定表达式的值,则不会再执行到第二个操作数处。
ECMAScript中的逻辑非运算使用“!”符号定义,需要注意,逻辑非运算一定会返回布尔值。逻辑非运算也被称为逻辑取反运算,其遵守表2-5所示的运算规则。
表2-5 “!”运算符的运算规则
当操作数不全是逻辑值时,有如下规则:
(1)如果操作数是对象,则返回false。
(2)如果操作数是数字0,则返回true。
(3)如果操作数是非0数字,则返回false。
(4)如果操作数是null,则返回true。
(5)如果操作数是NaN,则返回true。
(6)如果操作数是undefined,则返回true。