[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){ }