# 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。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up