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
,其判斷為undefined
string