[TOC]
# **Boolean:布尔类型**
  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】**关系操作符:>,>=,<,<=**
  当关系操作符的操作数使用了非数值时,要进行数据转换或完成某些奇怪的操作。
1. 如果两个操作数都是数值,则执行数值比较。
2. 如果两个操作数都是字符串,则逐个比较两者对应的字符编码(charCode),直到分出大小为止 。
3. 如果操作数是其他基本类型,则调用Number() 将其转化为数值,然后进行比较。
4. NaN 与任何值比较,均返回 false 。
5. 如果操作数是对象,则调用对象的 valueOf 方法(如果没有 valueOf ,就调用 toString 方法),最后用得到的结果,根据前面的规则执行比较。
```
'a' > 'b';// false, 即 'a'.charCodeAt(0) > '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】**相等操作符: **\==,!=,===,!==**
  \== 和 != 操作符都会先转换操作数,然后再比较它们的相等性。在转换不同的数据类型时,需要遵循下列基本规则:
* 如果有一个操作数是布尔值,则在比较相等性之前,先调用 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】**布尔操作符:!**
  布尔操作符属于一元操作符,即只有一个分项。其求值过程如下:
* 对分项求值,得到一个任意类型值;
* 使用 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
```
  逻辑操作符属于短路操作符 。在进行计算之前,会先通过 Boolean() 方法将两边的分项转换为布尔值,然后分别遵循下列规则进行计算:
* 逻辑与:从左到右检测每一个分项,返回第一个布尔值为 false 的分项,并停止检测 。如果没有检测到 false 项,则返回最后一个分项 。
* 逻辑或:从左到右检测每一个分项,返回第一个布尔值为 true 的分项,并停止检测 。如果没有检测到 true 项,则返回最后一个分项 。
```
[] && {} && null && 1;//null
[] ; {} ; !null 1 ;//1
null || undefined || 1 || 0;//1
undefined || 0 || function(){};//function(){}
```
<br>
## 【4】**条件语句:if,while,?**
  条件语句通过计算表达式返回一个布尔值,然后再根据布尔值的真假,来执行对应的代码。其计算过程如下:
* 对表达式求值,得到一个任意类型值
* 使用 Boolean() 将得到的值转换为布尔值 true 或 false
```
if(arr.length) { }
obj obj.name ?'obj.name' :''
while(arr.length){ }