[TOC] # **Boolean:布尔类型** &emsp;&emsp;Boolean 类型只有两个字面值:true 和 false 。 在 JavaScript 中,所有类型的值都可以转化为与 Boolean 等价的值 。转化规则如下: *  所有对象都被当作 true *  空字符串被当作 false *  null 和 undefined 被当作 false *  数字 0 和 NaN 被当作 false  ``` Boolean([]);//true Boolean({});//true Boolean(undefined);//false Boolean(null);//false Boolean(''); //false Boolean(0); //false Boolean(NaN);//false ``` 除 Boolean() 方法可以返回布尔值外,以下 4 种类型的操作,也会返回布尔值。 <br> ##  【1】**关系操作符:>,>=,<,<=** &emsp;&emsp;当关系操作符的操作数使用了非数值时,要进行数据转换或完成某些奇怪的操作。 1. 如果两个操作数都是数值,则执行数值比较。 2. 如果两个操作数都是字符串,则逐个比较两者对应的字符编码(charCode),直到分出大小为止 。 3. 如果操作数是其他基本类型,则调用Number() 将其转化为数值,然后进行比较。 4. NaN 与任何值比较,均返回 false 。 5. 如果操作数是对象,则调用对象的 valueOf 方法(如果没有 valueOf ,就调用 toString 方法),最后用得到的结果,根据前面的规则执行比较。  ``` 'a' > 'b';// false, 即 'a'.charCodeAt(0) &gt; 'b'.charCodeAt(0)\ 2 > '1'; // true, 即 Number('1') = 1 true>; 0;//true, 即 Number(true) = 1 undefined > 0;//false, Number(undefined) = NaN null< 0;//false, Number(null) = NaN newDate > 100;//true , 即 new Date().valueOf() ``` <br> ## 【2】**相等操作符: **\==,!=,===,!==** &emsp;&emsp;\== 和 != 操作符都会先转换操作数,然后再比较它们的相等性。在转换不同的数据类型时,需要遵循下列基本规则: * 如果有一个操作数是布尔值,则在比较相等性之前,先调用 Number() 将其转换为数值; * 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前,先调用 Number() 将字符串转换为数值; * 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较; * null 和 undefined 是相等的。在比较相等性之前,不能将 null 和 undefined 转换成其他任何值。 * 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true; * 如果两个操作数都是对象,则比较它们的指针地址。如果都指向同一个对象,则相等操作符返回 true;否则,返回 false。 \=== 和 !== 操作符最大的特点是,在比较之前不转换操作数 。它们的操作规则如下: * \===: 类型相同,并且值相等,才返回 true ,否则返回 false 。 * !== : 类型不同,或者值不相等,就返回 true,否则返回 false 。 ``` null === undefined;//false, 类型不同,直接返回 false [] === [];//false ,类型相同,值不相同,指针地址不同 a=[],b=a,a===b;//true, 类型相同,值也相等 1 !=='1' ;// true , 值相等,但类型不同 [] !== [] ; // true, 类型相同,但值不相等 ``` <br> ##  【3】**布尔操作符:!** &emsp;&emsp;布尔操作符属于一元操作符,即只有一个分项。其求值过程如下: * 对分项求值,得到一个任意类型值; * 使用 Boolean() 把该值转换为布尔值 true 或 false; * 对布尔值取反,即 true 变 false,false 变 true ``` !(2+3) ;// false !(function(){});//false !([] null '');//true ``` 利用 ! 的取反的特点,使用 !! 可以很方便的将一个任意类型值转换为布尔值: ``` console.log(!!0);//false console.log(!!'');//false console.log(!!(2+3));//true console.log(!!([] null ''));//false ``` 需要注意的是: >[success] 逻辑与 “&&” 和 逻辑或 “||” 返回的不一定是布尔值,而是包含布尔值在内的任意类型值。  如下所示: ``` [] 1;//1 null undefined;//null [] || 1;//[] null || 1;//1 ``` &emsp;&emsp;逻辑操作符属于短路操作符 。在进行计算之前,会先通过 Boolean() 方法将两边的分项转换为布尔值,然后分别遵循下列规则进行计算: * 逻辑与:从左到右检测每一个分项,返回第一个布尔值为 false 的分项,并停止检测 。如果没有检测到 false 项,则返回最后一个分项 。 * 逻辑或:从左到右检测每一个分项,返回第一个布尔值为 true 的分项,并停止检测 。如果没有检测到 true 项,则返回最后一个分项 。 ``` [] &amp;&amp; {} &amp;&amp;&nbsp;null&nbsp;&amp;&amp; 1;//null [] ; {} ; !null 1 ;//1 null || undefined || 1 || 0;//1 undefined || 0 || function(){};//function(){} ``` <br> ## 【4】**条件语句:if,while,?** &emsp;&emsp;条件语句通过计算表达式返回一个布尔值,然后再根据布尔值的真假,来执行对应的代码。其计算过程如下: * 对表达式求值,得到一个任意类型值 * 使用 Boolean() 将得到的值转换为布尔值 true 或 false ``` if(arr.length) { } obj obj.name ?'obj.name' :'' while(arr.length){ }