undefined 和 'undefined'

 你又提出了一個非常非常重要的觀念,這是一個初學者經常會掉入的陷阱!

答案是:絕對不行!if(result !== 'undefined') 的寫法是錯誤的,而且會導致非常隱蔽的 Bug。

為什麼不行?核心區別

關鍵在於 undefined'undefined' 是兩種完全不同的東西:

  • undefined (沒有引號):

    • 這是一個 JavaScript 的原始資料型別 (Primitive Type)

    • 它代表一個變數「已被宣告,但尚未被賦值」。

    • chrome.alarms.get() 在找不到鬧鐘時,回傳的就是這個型別的值。

  • 'undefined' (有引號):

    • 這是一個字串 (String)

    • 它的內容恰好是 "u", "n", "d", "e", "f", "i", "n", "e", "d" 這幾個字元組成的。

    • 它和 'hello''123' 在本質上是一樣的,就是一個普通的字串。

把這兩者搞混,就像是把數字 5 和文字 "五" 搞混一樣。 它們看起來代表同一個概念,但在程式語言中是完全不同的東西。


你的寫法會發生什麼事?

讓我們來分析 if(result !== 'undefined') 這個條件:

情況1:鬧鐘不存在

  1. result 的值是 undefined (型別)。

  2. 你的判斷是 undefined !== 'undefined' (字串)。

  3. 一個 undefined 型別的值永遠不等於一個 string 型別的值。

  4. 所以 undefined !== 'undefined' 的結果是 true

  5. if 條件通過了!你的程式碼會錯誤地進入 if 區塊,然後嘗試執行 result.name同樣會導致 "Cannot read properties of undefined" 錯誤

情況2:鬧鐘存在

  1. result 的值是一個物件,例如 { name: 'myAlarm', ... }

  2. 你的判斷是 {...} !== 'undefined' (字串)。

  3. 一個物件永遠不等於一個字串。

  4. 所以 {...} !== 'undefined' 的結果也是 true

  5. if 條件也通過了

結論:你的這個 if 判斷條件永遠都是 true,它沒有任何篩選作用,是一個邏輯上的 Bug。


正確的檢查方式 (複習)

寫法範例解釋推薦度
錯誤寫法if (result !== 'undefined')(錯誤) 比較的是字串,這個條件永遠為 true,無法過濾掉 undefined絕對不要用
Truthiness 檢查 (最佳)if (result)(正確) 最簡潔。利用 undefined 是 "falsy" 值的特性。同時也能過濾掉 null★★★★★ (首選)
嚴格比較if (result !== undefined)(正確) 意圖非常明確,直接比較 result 是否不等於 undefined 這個型別★★★★☆ (非常清晰)
typeof 檢查if (typeof result !== 'undefined')(正確) 這是比較 result型別字串。這是唯一一種 undefined 需要加引號的正確用法,因為 typeof 運算符的回傳值就是一個字串。★★★☆☆ (稍嫌冗長,但在某些特殊情況下有用)

黃金法則
當你想在程式碼中表示 undefinednulltruefalse 這些原始值時,絕對不要給它們加上引號

留言

這個網誌中的熱門文章

Offscreen Canvas

外部網頁新增 Google 日曆行程(URL模板)

計算 Canvas 文字最大字體