JS逻辑运算符&&、||
问题
今天温习了w3schoolJavascript高阶教程ECMAScript Boolean 运算符 http://www.w3school.com.cn/js/pro_js_operators_boolean.asp
在看到逻辑 AND 运算符:
如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值
然后它列举了几个规则,其中第一条:
如果一个运算数是对象,另一个是 Boolean 值,返回该对象。
然后我就在控制台想用代码敲一边,发现了矛盾的地方:
声明一个对象 var a=new Object()
,a && true
的结果是true
,而非教程里说的返回该对象。只有true && a
才能返回a对象:
这里就 逻辑 AND 运算符
的规则做一个说明和记录,如果有不对的,还望大家不吝赐教。
逻辑值对照表
ECMAScript-262 v5 规范中描述的 ToBoolean 操作, 将其参数按照下表中的规则转换为逻辑值:
参数类型 | 逻辑值结果 |
---|---|
Undefined | false |
Null | false |
Boolean | 结果等于输入的参数(不转换) |
Number | 如果参数为 +0, -0 或 NaN,则结果为 false;否则为 true。 |
String | 如果参数为 空字符串,则结果为 false;否则为 true。 |
Object | true |
这个表格下面要用到。
逻辑 AND 运算符
逻辑 AND 运算符用双和号(&&)表示:a && b
逻辑 AND 运算的运算数可以是任何类型的,不止是 Boolean 值。
如果某个运算数不是原始的 Boolean 型值,逻辑 AND 运算并不一定返回 Boolean 值。
因为逻辑 AND的运算规则为同真才真,一假则假,所以逻辑 AND 运算处理过程应该是这样的:
-
先判断第一个运算数的逻辑值(运算数的逻辑值参考上面的表格,比如运算数为对象,逻辑值为true)。
如果该逻辑值为false,根据一假则假,该逻辑运算结果肯定为false,则不再继续计算后面的运算数,直接返回第一个运算数本身(而不是其逻辑值,即如果第一个运算数是字符串
就返回字符串,对象
就返回对象,是数字
就返回数字,是undefined
就返回undefiend,是boolean值
就返回booolean)。
这种情况 真正参与 逻辑计算的只有第一个运算数,故它是真正参与此次逻辑运算的第一个也是 最后一个 运算数。 -
如果第一个运算数的逻辑值为true,根据 同真才真,还不能确定逻辑运算结果,则 继续运算 ,这里如果只有两个运算数,实际上不再判断第二个运算数的逻辑值,而是直接返回 第二个运算数本身 。
这种情况两个运算数都参与逻辑计算,返回第二个运算数也就是 真正参与此次逻辑运算的最后一个运算数本身。- 如果直接打印(console.log),那么输出的就是第二个运算数本身,
- 如果是个if判断,则在if里再根据返回的这个第二个运算数本身的逻辑值来判断(如下图)
-
上面具体说明了两个运算数的逻辑 AND 运算,如果是多个规则不变,以此类推。
综上所述 : 逻辑 AND 运算,在同真才真,一假则假的原则上, 总返回真正参与逻辑运算的最后一个运算数本身(而不是其逻辑值)。
逻辑 OR 运算符
同理,对于逻辑 OR 运算,在一真则真,同假才假的原则上, 总返回真正参与逻辑运算的最后一个运算数本身(而不是其逻辑值)。