undefined 是 ECMAScript 很特殊的存在,實務上有多種判斷方式。
Version
macOS Catalina 10.15.1
VS Code 1.40.2
Quokka 1.0.262
ECMAScript 2015
Undefined
undefined 有 4 種可能:
- 有宣告 variable,但還沒給定初始值
- 還未宣告 variable
- 不存在的 property
- Function 未回傳任何值
===
var foo
foo === undefined // ?
foo 只有宣告,但沒有給定初始值,這種 undefined 可用 === undefined 抓到。

foo === undefined // ?
foo 連宣告都沒有,雖然也是 undefined,但 === undefined 抓不到。
===
undefined只能抓到有定義,但尚未初始化的 variable

Falsy Value
var foo
!foo // ?
undefined 是 falsy value,因此也可以使用 ! 攔截到 undefined。
false、0、''、NaN、null與undefined都是 falsy value,因此也可能同時攔截到非undefined

!foo // ?
foo 連宣告都沒有,也是 undefined,但 falsy value 無法使用。

void 0
var foo
foo === void 0 // ?
根據 ECMAScript 定義,void operator 搭配任何 expression,期結果都是 undefined,因此也可以使用 void 0 來判斷。

foo === void 0 // ?
foo 連宣告都沒有,也是 undefined,但 === void 0 抓不到。

Object.prototype.toString()
var foo
Object.prototype.toString.call(foo).slice(8, -1) // ?
foo 只有宣告,但沒有給定初始值,這種 undefined 也可用 Object.prototype.toString() 抓到,但要判斷的是 Undefined string,第一個字母U 要大寫。
foo要借用Object.prototype.toString(),因此使用call()將foo傳進去,但toString()回傳為[Object Undefined]string,因此要再使用slice()加工取得Undefined

Object.prototype.toString.call(foo).slice(8, -1) // ?
foo 連宣告都沒有,也是 undefined,但 Object.prototype.toString() 抓不到。

typeof
var foo
typeof foo === 'undefined' // ?
foo 只有宣告,但沒有給定初始值,這種 undefined 可用 typeof 抓到,但回傳是 undefined string,不是 undefined value。

typeof foo === 'undefined' // ?
foo 連宣告都沒有,也是 undefined,但 typeof 也可順利抓到 undefined。
typeof可以攔截到所有的undefined,無論是有宣告的 variable 但尚未初始化,或者根本沒有宣告的 variable

Conclusion
Falsy value 雖然方便,但可能會攔截到
undefined以外的值,要小心使用void 0被強制定義為undefined,因此也可用來判斷Object.prototype.toString()會傳出比typeof更詳細的型別資訊只有
typeof可攔截到所有的undefined,其判斷為undefinedstring