逻辑与:&&
第一层理解,也是最浅显的直接的:
当两个操作数,或者是表达式都是布尔值的时候: 这里的布尔值是指Boolean类的两个值,是在没有转换真假值的情况。
例子: x==0&&y==0 x==0--true y==0--true 最后这个逻辑表达式返回true
有点数学逻辑的就看得出,都为真 才返回真。 一个为false 则返回false.
第二层理解,不仅仅都是布尔值的情况:
因为能转换成布尔值的可以是任意数据类型,所有这样的数据类型分为真值(转换为true),假值(转换为false)。
假值共有七个:false 0 -0 null undefine "" NaN;
真值是除了假值以外的所有值。
在这样的概念下。我们可以把第一层理解再进行一次归类,把第一层理解归为:当且仅当&&的两个操作数是真值的ture 或者假值的false时产生的判断规则。
同样在这样的概念下,第二层理解就好理解了:当&&的两个操作数是真值或者假值的情况。
可以看出来,第一层理解是第二层理解的特殊情况,是第二层理解的子集。
判断规则:从左到右
如果两个操作数都是真值, 则返回一个真值;否则,至少一个操作数是假值的话,返回一个假值(这样说的不清不楚,容易使读者产生迷惑,后面的例子会有更清晰的解释),在JS中任何希望使用布尔值的地方,表达式语句会将其当作真值或者假值来对待,所以&&并不总是返回true或者false,也会返回其他的真值假值的情况。
例如: console.log(1 && 0) -- 0 1为真值 0为假值,返回的是0;0 && "" --0 ; ""&& 0 -- ""; 1 && 2--2; 1 && true-- true;
可以看出规律:
在第二层的概念下:&&更偏向返回假值,对第一个操作数进行布尔转换,假设第一个就是假值,直接返回第一个值(短线操作),如果第一个操作数是真值,则继续会对第二个操作数进行布尔转换,如果第二个操作数是假值,则返回第二个操作数,如果第二个还是真值,也会返回第二个真值。也就是说当第一个操作数是真值的情况,表达式的结果都依赖第二个操作数的结果
短线操作:在第一个操作数为假值的情况,不去计算第二个操作数。脑子短路了,所以叫做短线操作。
例子:var p =null;p && p.toString;返回p;因为null为假值,所以第二个操作数就短路了,程序也不去理睬 ,即使p.toString也不报错。
注意的是:如果右侧操作数具有副作用(赋值,递增,递减,函数调用表达式)要注意,因为这些带有副作用的执行依赖于左操作数的计算结果,因为短路的存在,后续需要这些副作用的地方就会遇到麻烦。
为了大家方便理解,自己画了流程图:
总结第二层:真的很喜欢假值,对假值一路穷追猛打,这不会是个假运算符把?
第三层理解
在原著中,作者说共有三层理解,而我认为,作者的第三层理解,仅仅是对第二层理解的补充说明,并没有太多实质的意义,原著把第二层理解,仅仅用一句话说明,却在第三层理解里不断解释第二层理解中那一句话的各种情况,所以我认为其实一共共有两层理解足够了,所以我把作者的意思提炼在本文的第二层理解中。
逻辑或:||
书中并没有对这个运算符做大篇幅的说明,跟&&不一样,没有分几层几层理解。作者的意图可能是在&&花了大篇幅去叙述,其实||也差不多;
所以我可以把||分为两个理解层面(和&&一样):
第一层理解:两个操作数是真值里的true或者假值里的false;
例如 x==1&&y==1; x==1 --true y==1--false返回true x==1 --false y==1--false返回false
简言之,其中一个为true返回true 只要有一个false就返回false(一颗老鼠屎坏了一锅粥,只有一颗就足够了)
第二层理解:
两个操作数是真值或者假值的情况下。
首先计算第一个操作数的值,如果是真值,就立刻返回这个真值,否则,在计算第二个操作数的值,并返回这个值。
是不是非常简单?
例子: 0 || 1 -- 1; 1||0 -- 1;0 || null --null;
由于非常简单,流程图就不做了。
总结:
||非常喜欢真值,第一个遇到真值立马就追,不理睬第二个操作数是真是假了。这也是个短线操作。
假如遇到第一个是假值,那么第二个操作数无论是真值是假值都会返回这个操作数,这点很重要。
常常利用这个特性用在函数体内提供默认值 var max = a || b || c;
a不存在就用b,b不存在就用c;等于给max这个值有了双重保险,拥有很多备胎。
逻辑非:!
属于一元操作符,拥有高优先级,右结合性。目的和名字一样很纯粹,就是将操作数的布尔值求反。
和前面两个运算符不同,!把操作数转换成布尔值,求反,在返回求反后的布尔值,所以输出true,要么输出false。
有个便利的用法!!x,可以快速的求得x的布尔值,有种类型转换的味道。