本文只针对
&&和||的行为进行一个理解,真实情况下JS引擎是不是这么做的我并没有考察
知识铺垫
在讲&&和||之前,我们需要了解一个函数Boolean
它的行为如下:
- 返回为true的:
Boolean(true)Boolean(非空字符串类型)Boolean(非零非NaN数字类型(包括Infinity))- null的结果为false
- undefined的结果为false
Boolean(任何对象类型)
- 返回为false的参数:
Boolean(false)Boolean(空字符串)Boolean(0或者NaN)Boolean(null)Boolean(undefined)- 对象类型的结果为true
其实就是if(...)里面的隐式转化逻辑,但是实际上这里在隐式转化时用的方法是不是就是Boolean我还没有深究,欢迎评论补充。
回到正题
其实这两个符号就是一个短路运算符,它的作用是返回一个操作数,规则如下:
对每个操作数进行Boolean():
-
对于
||:从左到右找Boolean()返回为true的操作数,如果能在最后一个
||之前找到返回为true的操作数,就返回这个操作数然后结束,否则,返回最后面的操作数 -
对于
&&:从左到右找Boolean()返回为false的操作数,如果能在最后一个
&&之前找到返回为false的操作数,就返回这个操作数然后结束,否则,返回最后面的操作数
其实这个规则也适用于我们一般遇到的逻辑判断:
true || false
true || true
false || true
false || false
true && false
true && true
false && true
false && false
以上均在V8非严格模式测试,欢迎评论区交流、批评、指正