前言
在 JavaScript 中很多比較的情況非常不符合邏輯,在今年 AIS3 (2019) pre-exam 中,有考到類似概念所引發的錯誤情形。於是記錄一下 JavaScript 在比較物件時到底是依據什麼規則。
先看幾種常見的情況
1 | > 100 > 10 |
物件的比較規則
來點科普
這次的重點在於兩個物件的比較是依據何者來比較,首先要先知道 JS 有幾種型態
- null
- undefined
- boolean
- number
- string
- symbol
- object
所以 JS 的型態都在這七種之內。然而,除了 object 以外,都屬於基本型態(primitive data type)。
比較的依據
物件的比較流程為以下(若成功則停,失敗則往下一步):
- 呼叫物件內的 valueOf 方法求得 return 值(值必須為 primitive data type)
(若非 primitive data tpye 或是沒有 valueOf 方法則往下)
- 呼叫 toString 方法求得 return 值(值必須為 primitive data type)
(若非 primitive data tpye 或是沒有 valueOf 方法則往下)
- 拋出錯誤 (TypeError: Cannot convert object to primitive value)
進行實驗
- 實驗一 (object 內的 valueOf):
1 | let obj = { |
- 實驗二 (valueOf 回傳值不是 primitive data type):
1 | let obj = { |
- 實驗三 (valueOf 與 toString 的比較順序):
1 | let obj = { |
1 | let obj = { |
- 實驗四(兩者回傳值都非為 primitive data type,拋出錯誤)
1 | let obj = { |
物件預設的 valueOf, toString
1 | let obj = {}; |
預設情況下物件是的 valueOf 是回傳空物件 {},而 toString 則是回傳 [object Object] 字串!
結論
希望這篇物件比較的規則說明有幫助到大家,javascipt 真是一門神奇的語言(?) 😄