逻辑与、或、非中至少一个操作数不是布尔值的情况讨论

在与运算的两个操作数都是布尔值时,很容易就能得出结果。但假使至少有一个操作数不是布尔值呢?

一、第二个操作数不是布尔值

如果第二个操作数不是布尔值,如下:

true&&{a:1};//{a:1}
false&&{a:1};//false
console.log(true && null);//null
console.log(false && null);//false
console.log(true && undefined);//undefined
console.log(false && undefined);//false
console.log(true && NaN);//NaN
console.log(false && NaN);//false
console.log(true && "hello");//"hello"
console.log(false && "hello");//false
console.log(true && 1);//1
console.log(false && 1);//false
console.log(true && [1,2]);//[1, 2]
console.log(false && [1,2]);//false

这里我们发现,第二个操作数不是布尔值的时候,与两个操作数都是布尔值时是类似的,即:如果第一个操作数是true,就返回第二个操作数;如果第一个操作数是false,就返回false.
二、第一个操作数不是布尔值

将第一个操作数换成对象、数组、函数、正则、Date、非零数字、非空字符串:

console.log({a:1} && 1);//1
console.log({a:1} && undefined);//undefined
console.log({} && {a:1});//{a:1}

console.log([1,2] && true);//true
console.log([1,2] && false);//false
console.log([] && true);//true
console.log([] && false);//false
console.log([] && {});//{}
console.log([] && null);//null

console.log(function(){} && true);//true
console.log(function(){} && false);//false
console.log(function(){} && {});//{}

console.log(new RegExp() && true);//true
console.log(new RegExp() && false);//false
console.log(new RegExp() && {});//{}

console.log(new Date() && true);//true
console.log(new Date() && false);//false
console.log(new Date() && {});//{}

console.log(1 && NaN);//NaN
console.log(1 && undefined);//undefined
console.log(1 && {});//{}

console.log("hello" && {});//{}
console.log("hello" && NaN);//NaN
console.log("hello" && undefined);//undefined

显然,第一个操作数是对象、数组、函数、正则、Date、非零数字、非空字符串时,总是返回第二个操作数。
如果,第一个操作数是null、undefined、NaN、0、空字符串呢?

null && {};//null
null && false;//null
null && true;//null
null && NaN;//null
null && undefined;//null
null && 1;//null

console.log(NaN && {});//NaN
console.log(NaN && false);//NaN
console.log(NaN && true);//NaN
console.log(NaN && NaN);//NaN
console.log(NaN && undefined);//NaN
console.log(NaN && 1);//NaN

console.log(undefined && {});//undefined
console.log(undefined && false);//undefined
console.log(undefined && true);//undefined
console.log(undefined && NaN);//undefined
console.log(undefined && undefined);//undefined
console.log(undefined && 1);//undefined

console.log(0 && true);//0
console.log(0 && false);//0
console.log(0 && undefined);//0

console.log('' && true);//''
console.log('' && false);//''
console.log('' && undefined);//''

我们发现,第一个操作数是null、undefined、NaN、0、空字符串时,不论第二个操作数是什么,都会返回第一个操作数。

三、两个操作数都不是布尔值

上面所述已经涉及到两个都不是布尔值的情况,我们已经可以很容易的知道结果,这里就不再赘述。

四、总结

1、当第二个操作数不是布尔值时,和两个操作数都是布尔值的情况类似:

(1)若第一个操作数是true,则返回第二个操作数;
(2)若第一个操作数是false,则直接返回false。

2、当第一个操作数不是布尔值时:

(1)若第一个操作数是null、undefined、NaN、0、空字符串,无论第二个操作数是什么都返回第一个操作数本身;
(3)若第一个操作数是对象、数组、正则、Date、函数、非零数字、非空字符串,则可以将第一个操作数视作true,返回第二个操作数。

五、逻辑与、非的情况

在有了上述结果后,不难得出逻辑或的结果,这里也将不再赘述。
对于逻辑非:
(1)null、undefined、NaN、0、空字符串做非运算,可将本身看作false,结果为true;
(2)对象、数组、正则、Date、函数、非零数字、非空字符串做非运算,可将本身看作true,结果为false。
读者可自行测试。

原文地址:https://www.cnblogs.com/twodog/p/12134745.html