zoukankan      html  css  js  c++  java
  • js中的boolean原始类型和Boolean引用类型

    js 代码

     
    1. var bFound = true;  
    2. var bFlag = false;  

    如上面的两行代码,boolean类型是JavaScript中的一种原始类型,它只有两种值:true和false。

    使用Boolean(value)方法可以强制转换任意值为boolean类型

    js 代码
     
    1. alert(Boolean('')); //outpt false  
    2. alert(Boolean('hello')); //output true  
    3. alert(Boolean(100)); //output true  
    4. alert(Boolean(0)); //output false
    5. alert(Boolean(NaN)); //output false
    6. alert(Boolean(null)); //output false  
    7. alert(Boolean(undefined)); //output false  
    8. alert(Boolean(new Object())); //output true   

    可以看出,当被转换的值为空字符串、数字0和NaN、null或者undefined时,转换为false,其它情况转换为true。所以当我们写if判断的时候需要注意这些特殊的情况,尤其是使用目前比较流行的“对象探测法”书写JS时。

    “对象探测法”主要写法如下:

    js 代码
     
    1. var student = new Object();  
    2. if (student.name) {  
    3.   alert(student.name);  
    4. else {  
    5.   student.name = 'Tom';  
    6.   alert(student.name);  
    7. }  

    if (student.name)这句用来探测student对象中存不存在name属性,如果存在则弹出;否则把name赋值为'Tom',再弹出。这边需要注意的是如果name值已经存在,并且值为空字符串或者0时,结果可能与你预期的不同。

    在JavaScript中除了存在boolean类型这样的原始类型之外,还存在一种引用类型 -- Boolean类型。创建Boolean类型的对象的代码如下:

    js 代码
     
    1. var oBooleanObject = new Boolean(true);  

    需要注意的是这边的"new Boolean()"与前面的"Boolean()"的区别,前者是创建Boolean对象,后者为强制类型转换方法。不过,在大多数情况下Boolean类型是不常被用到的。并且在使用Boolean类型的时候还可能产生一些误会,看看下面的代码:

    js 代码
     
    1. var oBooleanFalse = new Boolean(false);  
    2. alert(oBooleanFalse && true); //output true  

    这边输出是true,让人觉得奇怪。当执行oBooleanFalse && true时,oBooleanFalse被强制类型转换了,而这边oBooleanFalse是一个Object,强制转换后为true。也就说这边用来计算的是oBooleanFalse对象本身,而不是它的值false。
    虽然我们需要了解Boolean这种类型,但为了避免错误,最好还是使用boolean原始类型。

    再看下面一个例子:

    js 代码
    1. var ob1 = new Boolean(false);  
    2. var ob2 = (ob1&&true);  
    3. var ob3 = (true&&ob1);  
    4. var ob4 = Boolean(ob1&&true);  
    5. var ob5 = Boolean(true&&ob1);  
    6. alert("ob2 = " + ob2 + ", ob3 = " + ob3 + ", ob4 = " + ob4 + ", ob5 = " + ob5);
    7. //output ob2 = true, ob3 = false, ob4 = true, ob5 = true 

    这边最让人困惑的就是ob2和ob3由于顺序上的不同,最终的结果居然不同。产生这样的结果主要和JavaScript中的逻辑运算符的工作方式相关。具体工作方式如下:
    1. && 的工作方式:
    从第一个开始,遇到值为false的表达式(fasle、null、undefined、0、NaN、‘’)则返回此表达式,否则返回最后一个表达式(注意,这边所说的表达式不一定为boolean类型)
    2. || 的工作方式:从第一个开始,遇到值为true的表达式(与上面&&相反的其他情况)的返回此表达式,否则返回最后一个表达式
    3. ! 的工作方式:对表达式的值取非(注意不是对表达式)。

    回到上面的例子,我们可以知道,对于var ob2 = (
    ob1&&true);,首先看ob1表达式强制转换为boolean类型后的值,这边ob1为Boolean引用类型,从前文可知强制转换后值为true。逻辑运算(ob1&&true)会继续看下一个值true。这时,逻辑运算&&发现这已经是最后一个值,所以返回了最后的这个表达式true。最终我们的ob2 = true。
    对于var ob3 = (true&&ob1);,首先第一个表达式是true,接着看第二个表达式ob1,由于这已经是最后一个表达式了,所以返回ob1。最终ob3 = ob1 = new Boolean(false);即ob3是一个Boolean引用类型。
    最后,在alert语句中,使用"ob3 = " + ob3时,默认会调用ob3的toString()方法,而Boolean类型的toString方法即是输出它自己的内部值。这边ob3的内部值为false。了解到这样的特性后,对于ob4和ob5的结果也就不难理解了。

    JavaScript 中 if() 圆括号中的表达式将被看做布尔值来处理.

    总之:

    1.特殊值undefined和null变成false.

    2.数字0和NaN变成false.

    3.空字符串变成false.

    4.所有其他值都变成true.

  • 相关阅读:
    Python--魔法方法
    Flask之request实现思想
    关于python一切皆对象的理解
    python快速生成依赖包
    redis的安装和使用
    linux-环境变量的配置
    python-虚拟环境的配置
    11-Linux-系统服务
    10-Linux-进程管理
    [SCOI2014]方伯伯的玉米田
  • 原文地址:https://www.cnblogs.com/majunfeng/p/3933844.html
Copyright © 2011-2022 走看看