zoukankan      html  css  js  c++  java
  • 逻辑与、或、非中至少一个操作数不是布尔值的情况讨论

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

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

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

    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。
    读者可自行测试。

  • 相关阅读:
    python excel 像 Excel 一样使用 python 进行数据分析
    ubuntu 系统分区
    ubuntu 配置和修改ip地址
    yum centos 修改镜像源
    centos6 安装 docker 问题
    Feign 的简单使用(2)
    feign client 的简单使用(1)
    xsync
    canal 配置
    javascript之DOM编程正则表达式引入
  • 原文地址:https://www.cnblogs.com/twodog/p/12134745.html
Copyright © 2011-2022 走看看