為 == 辯護:一個更強的論點
本文是相等性討論的最終章。前幾篇建立了
==演算法的完整知識、null/undefined的特殊相等性、Boolean 的角落案例,以及使用準則。這篇要把所有討論匯整成一個更大膽的主張。
核心主張:知道型別時,== 更好
Kyle Simpson:
當你知道比較中的型別時,
==在所有情境下都是更好的選擇。
這不是「你可以使用 ==」,而是「你應該優先使用 ==」。以下是這個主張的完整論證。
論證一:型別相同時,== 與 === 完全等價
這是前幾篇已建立的基礎:型別相同時,== 直接執行 ===,兩者行為完全一致。
在這種情況下,使用 === 沒有任何額外保護,只是多打了一個字元。Kyle Simpson 的主張是:在這個情境下,=== 是不必要的(unnecessary),而不必要的東西應該被省略。
論證二:TypeScript 的邏輯支持這個立場
TypeScript 的型別推斷會在你用 === 比較兩個不可能相等的型別時給出警告:
javascript
var teacher = 'Student';
var numStudents = 42;
if (teacher === numStudents) {
// TypeScript 錯誤:This condition will always return 'false'
// since the types 'string' and 'number' have no overlap.
}如果我們認可「用 === 比較永遠不可能相等的型別是沒有意義的」,那麼相對地,「用 === 比較永遠相同的型別也是不必要的」。這個邏輯的對稱性支持了 == 的選擇。
論證三:型別不同時,== 比多個 === 更高效
當你知道型別,且知道它們不同(例如一個數字、一個字串),你有兩個選擇:
- 一個
==,允許強制轉型做比較 - 兩個或更多
===,加上手動轉型或多重條件判斷
這兩者不是等價的比較。=== 陣營常說「=== 比 == 快,因為不做強制轉型」,但這是蘋果比橘子——一個 === 與一個 == 在型別不同時根本不等價。真正的等價比較是:一個 == vs 兩個或多個 ===,而前者永遠更快、更簡潔。
論證四:=== 的語意應該保留給「不確定型別」的情境
這是整個論證中最有力的一點,關於語意溝通:
如果你在整個程式碼庫中到處使用 ===,你向未來的讀者傳遞的訊號是:「我不確定這裡的型別,所以我用 === 自保。」。
這個訊號不只影響理解,還影響讀者的後續行為。
Kyle Simpson 的建議是把 === 的使用保留給真正不確定型別的場合,讓它成為一個有意義的訊號:「這裡我不確定型別,請小心。」
另一面:不知道型別時,用 ===
這個論點並非要全面廢除 ===,而是要賦予它正確的語意:
| 情境 | 建議 | 原因 |
|---|---|---|
| 知道型別,且型別相同 | == | 與 === 等價,更簡潔 |
| 知道型別,且型別不同 | ==(允許強制轉型)或重新設計比較 | 一個 == 比多個 === 更簡潔 |
| 不知道型別 | === | 向讀者明確發出「此處有不確定性」的訊號 |
不知道型別時用 ===,不是因為 === 更安全,而是因為它在語意上正確地標記了「這裡有不確定性」。
小結
這個論點的核心不是「== vs === 哪個更好」,而是「讓你的型別清楚,然後選擇與你的知識相符的運算子」。知道型別時,== 更能清楚傳達意圖;不知道型別時,=== 是誠實地承認不確定性的工具。兩者都有正確的使用時機,而正確使用的前提是真正理解型別。
複習
什麼情況下建議使用 == 比較運算子?
當你知道比較中的型別時,尤其是兩種型別相同的情況下。講師主張在已知型別的情境下,== 更為適合,也可搭配已知型別與可選的強制轉型一起使用。
當你不知道比較中的型別時,建議採取什麼方式?
當型別未知時,使用 === 比較運算子,以發出型別不確定的訊號,並防止潛在的強制轉型角落案例。目標是讓未來的程式碼讀者清楚看到這裡存在不確定性。
講師建議如何處理型別不同的比較?
若已知型別不同,有兩個選擇:不做這個比較,或使用 == 運算子。若需要多個比較,使用 == 通常比多個 === 更快速且更不分散注意力。
到處使用 === 傳遞了什麼語意訊號?
到處使用 === 傳遞的訊號是你不理解型別、需要自我保護,這可能讓未來的讀者傾向於重寫程式碼以釐清型別知識。
講師關於比較運算子建議的核心原則是什麼?
讓型別清楚可見能帶來更好的程式碼。已知型別時建議使用 ==;型別未知時應使用 === 來發出不確定性的訊號。
小測驗
根據課程討論,何時應該使用 == 運算子?
當型別已知且相符時到處使用 === 傳遞了什麼語意訊號?
型別不確定,需要保護措施當比較中的型別不同時,建議怎麼做?
使用 == 或多個 === 比較了解型別如何影響程式碼品質?
了解型別能帶來更好、更易理解的程式碼當無法消除型別不確定性時,應該怎麼做?
使用 === 來發出型別不確定的訊號此文章是 FrontendMasters 上的 Deep JavaScript Foundations, v3 課程筆記
