JS逻辑表达式的探索

逻辑与:&&

第一层理解也是最浅显的直接的

当两个操作数,或者是表达式都是布尔值的时候:  这里的布尔值是指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也不报错。

注意的是:如果右侧操作数具有副作用(赋值,递增,递减,函数调用表达式)要注意,因为这些带有副作用的执行依赖于左操作数的计算结果,因为短路的存在,后续需要这些副作用的地方就会遇到麻烦。

为了大家方便理解,自己画了流程图:

JS逻辑表达式的探索_第1张图片

总结第二层:真的很喜欢假值,对假值一路穷追猛打,这不会是个假运算符把?

第三层理解

在原著中,作者说共有三层理解,而我认为,作者的第三层理解,仅仅是对第二层理解的补充说明,并没有太多实质的意义,原著把第二层理解,仅仅用一句话说明,却在第三层理解里不断解释第二层理解中那一句话的各种情况,所以我认为其实一共共有两层理解足够了,所以我把作者的意思提炼在本文的第二层理解中。


逻辑或:||

书中并没有对这个运算符做大篇幅的说明,跟&&不一样,没有分几层几层理解。作者的意图可能是在&&花了大篇幅去叙述,其实||也差不多;

所以我可以把||分为两个理解层面(和&&一样):

第一层理解:两个操作数是真值里的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的布尔值,有种类型转换的味道。


你可能感兴趣的:(JS逻辑表达式的探索)