---
# System prepended metadata

title: Js - Operator、Expression and Coercion
tags: [Language-js]

---

# Js - Operator、Expression and Coercion
###### tags: `Language-js`

## 一 . 運算式、運算子
### (一) . 運算式概念
1. 運算式和敘述 ： 
   - 運算式(expression) ： 會回傳一個value的instruction。
   - 敘述(statement)： 不會回傳value的instruction。
2. 運算子、運算元：
   - 運算子 ： 參數。
   - 運算元 ： 可以視為吃參數的函式。
### (二) . 運算子分類
1. 算術運算子 (Arithmetic Operator)。
2. 指派運算子 (Assignment Operator)。
3. 比較運算子 (Comparison Operator)。
4. 邏輯運算子 (Logical Operator)。
5. 位元運算子 (Bitwise Operator)。
7. 字串運算子 (String Operator)。
8. 特殊運算子 (Special Operator)。

### (三) . 轉型概念
1. JS中的自動轉型可以分成兩類 ： 隱含和強制的。
2. 強制轉型 ： 呼叫物件包裹器進行轉型。
3. 隱含轉型 ： 在運算子進行時由JS自動進行轉型。
   - 隱含轉型可以當成運算子的特性一起記憶。
   - **記憶上的方類可以分成** ： 
     - ***一方為基礎型別，另一方為物件***。
     - ***兩方都為基礎型別***。
     - ***兩方都為物件***。 


## 二 . 算術運算子和自動轉型
### (一) . 加法運算子
#### 情況一 ： 都是數字
1. 二者都是數字 : 直接相加。
2. 特殊數字 : 
     - Infinity : 還是Infinity，正負相加變NaN。
     - NaN : 跟任何相加都變NaN。 
```javascript=
Infinty+ -Infinty//NaN
```
#### 情況二 ： 有一者是字串

1. 令一者是null、undefined : 呼叫String()。
    - null : 變成"null"。
    - undefined : 變成"undefined"。 
2. 令一者是number、bool、object : 呼叫toString()。
    - number : 142627變"142627"。
    - bool : 變成"true"或"false"。
    - object : 變成"[object Object]"。
    - array : 變成array內所有的內容。
    - fuction : 整個function的code變成字串。  
```javascript=
var s="test";
s+null;       //"testnull"
s+undefined;  //"testundefined"
s+true;       //"testtrue"

var obj={
  name:"john"
};
s+obj         //test[ooject Object]
```
#### 情況三 . 數字和非字串

 1.  基礎型別 : 由Number轉型。
      - 基礎型別 : 由Number()轉成數字。
      - null : 0。
      - undefined : NaN。
      - bool : 0或1。
2. number + object : 二者都變成字串。
```javascript=
var num=10;
var n=null;
var un=undefined;
num+null;     //10
num+un;       //NaN
```

### (二) . 減法運算子
#### 情況一 ： 都是數字
1. 二者都是數字 : 直接相減。
2. 特殊數字 : infinty和NaN的運算。
#### 情況二 ： 數字和任何
 1. 基礎型別 : 由Number()轉成數字。
      - null : 0。
      - undefined : NaN。
      - string : 全都數字才轉成數字，否則為NaN。
      - bool : 0或1。 
 2. 物件 : 知道物件包裹器後再來看。
      - 若有定義valueOf()則用。
      - 若無，用toString()後再用Number()得值。
### (三) . 除法運算子
#### 情況一 ： 都是數字
1. 二者都為數字 : 直接除。若分母為0則變Infinity。
2. 特殊數字 : infinty和NaN的運算。

#### 情況二 ： 數字和任何
1. 基礎型別 : 由Number()轉成數字。
      - null : 0。
      - undefined : NaN。
      - string : 全都數字才轉成數字，否則為NaN。
      - bool : 0或1。 
2. 物件 : 知道物件包裹器後再來看。
      - 若有定義valueOf()則用。
      - 若無，用toString()後再用Number()得值。
### (四) . 乘法運算子
#### 情況一 ： 都是數字
1. 二者都為數字 : 直接乘，若大於js最大的數字範圍，則變為Infinity。
2. 特殊數字 : infinty和NaN的運算。
#### 情況二 ： 數字和任何
 1.  基礎型別 : 由Number()轉成數字。
      - null : 0。
      - undefined : NaN。
      - string : 全都數字才轉成數字，否則為NaN。
      - bool : 0或1。 
 2.  物件 : 知道物件包裹器後再來看。
      - 若有定義valueOf()則用。
      - 若無，用toString()後再用Number()得值。 
### (五) . 遞增遞減運算子
#### 情況一 ： 數字
   - 若為數字 : 同c++。
#### 情況二： 非數字，用Number()轉換。
   - null : 為0。
   - bool : 為0或1。
   - string : 全都數字才轉成數字，否則為NaN。
   - undefined : NaN。
   - object : 用Number()後為NaN。
### (六) . 正負運算子
#### 情況一 ： 數字
- 若為數字 : 同c++。
#### 情況二 ： 非數字
 - 基礎型別 : 用Number()轉換。
      - null : 為0。
      - bool : 為0或1。
      - string : 全都數字才轉成數字，否則為NaN。
      - undefined : NaN。
 - 物件 : 知道物件包裹器後再來看。
      - 若有定義valueOf()則用。
      - 若無，用toString()後再用Number()得值。 

## 三 . 比較運算子和自動轉型
### (一) . JS的比較運算子
1. 『＝＝』 : 比較時做自動轉型。 
2. 『＝＝＝』: 比較時不做自動轉型
3. 『 >』和『<』 : 即大於小於，遵守隱含的自動轉型。
4. 『>=』和『<=』: 即大於等於小於等於，遵守隱含的自動轉型。

### (二) . 『相等』比較時的自動轉型
#### 第一點 ： 基本概念 - 分基礎型別和物件
1. **基礎型別比較 ： 比『值』**。
   - 兩者或一者為基礎型別的比較，**主要為化『值』**。
3. **物件比較 ： 比『位址』**。
   - 兩者都物件的比較，為辨別**物件的記憶體位址**。
   - 相同屬性和方法的兩個物件，會不一樣。 
#### 第二點 ： 轉型原則 

1. 有一個「Boolean」的情況下，會將 true 轉型為「數字」的 1， false 則會變成數字的 0。
2. 字串與數字的情況下，字串透過 Number() 嘗試轉型為數字後，再進行比較。
3. 「物件」和基本型別的情況下 ： 
   - 透過物件的 valueOf() 方法取得對應的基本型別的值，再進行比較。


## 四 . 邏輯運算子和布林值
### (一) . Falsy 與 Truthy
1. ToBoolean 函式 : 可以將所有data type強制轉形成bool。
2. Falsy : 強制後會變成false的值。
   - null。
   - undefined。
   - ＋0或-0或NaN。
   - 空字串 : ''或""。
3. Truthy : 強制後會變成true的值。
   - 其他非上述。
### (二) . 邏輯運算子 
1. 只有『!』運算子再js中會回傳Boolean。
2. 『&&』 或 『||』 所產生的值不一定會是 Boolean，而是兩者其中之一。
   - && 與 || 運算子在判斷的時候，會先對左邊的數值進行檢查。
    - 如果是 Boolean 類型就再做後續的判斷，如果不是？那就會透過 ToBoolean 判斷是「falsy」或「truthy」來轉換成對應的 true 跟 false 。
    - 對 || 運算子來說，若第一個數值轉換為 true，則回傳第一個數值，否則回傳第二個數值。
    - 對 && 運算子來說，若第一個數值轉換為 true，則回傳第二個數值，否則回傳第一個數值。
3. 而if辨別式中的()若非為Boolean者，再強行轉成Boolean。