undefined 跟 null 是 JavaScript 中其二的原始資料型別(primitive data types,其他原始資料型別有 string, number, bigint, boolean, symbol ),但你有想過這兩個資料型別如果相加會發生什麼事情嗎?
那天同事就聊到了在別的語言裡 null + null 的情況,不禁讓我反思:如果是在 JS 裡,那麼 null + null 會回傳什麼?
+ 號既然是運算子,那麼應是把兩個 null 相加,但又因為 null 不是數字型別,所以應該是 NaN。結果如圖:
是 0,數字 0 啊!這是為什麼?原因要從標題的 + 號說起。
運算子 +
注意!+跟++是不一樣的運算子。
+ 號是個多種用途的運算子:
作為一元運算子時會嘗試將運算元轉換成數字(例如 +”3” 就是將運算元的字串 “3” 轉換成數字 3)。
作為二元運算子時,可以將兩個運算元相加,也可以將兩個運算元的字串結合在一起。
那麼要怎麼判斷應該要將前後當作字串結合,還是當作數字相加呢?
先看你是什麼原始型別
在 JS 的規則中,會先將兩個運算元強制轉換成原始型別——也就是開頭說到的 undefined, null, string, number, bigint, boolean, symbol ,如果其中一個運算元是字串 string,那就會把另一個運算元也轉成字串,當作字串組合。
當運算元都不是字串、也都不是 bigint(*) 的話,會將兩個運算元當作數字相加。
註:如果兩個運算元都是 bigint 的話,會正常進行相加,但如果其中一個不是 bigint 的話,則會出現 TypeError。
轉成原始型別(primitive data types)再相加
如果是轉換成數字,可以看到 MDN 針對不同型別在進行轉換後都有說明,而 null 在轉成數字後會是 0,null + null 會轉換成 0 + 0,結果自然是 0。
小結
在這次研究的過程中,重新了解了程式碼在處理運算元、運算子的先後順序以及規則,覺得又長了一點知識。
參考資料
- https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Addition
- https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Data_structures#強制轉換原始型別
- https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Guide/Expressions_and_operators
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_coercion











