Skip to content

2026-06-08

/ 11 分鐘閱讀

/ Deep JavaScript Foundations v3

== 辯護:一個更強的論點

本文是相等性討論的最終章。前幾篇建立了 == 演算法的完整知識、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 課程筆記

最後更新時間:

Buy Me A Coffee

系列章節 第 27 篇 / 共 51 篇

0 %
MIT Licensed | Copyright © 2025-present Wen-Hsiu's Blog
Photo by Federica Galli on Unsplash