點燈坊

失くすものさえない今が強くなるチャンスよ

使用 isNil() 同時判斷 undefined 與 null

Sam Xiao's Avatar 2019-12-09

undefinednull 是 ECMAScript 很特殊的存在,實務上我們常會同時判斷 undefinednull ,有更優雅的寫法嗎 ?

Version

macOS Mojave 10.14.5
VS Code 1.36.1
Quokka 1.0.233
ECMAScript 5
Ramda 0.26.1

||

let isNil = val => val === undefined || val === null

isNil(undefined) // ?
isNil(null) // ?

最中規中矩的寫法就是配合 ||,同時判斷 undefinednull

null000

Falsy Value

let isNil = val => !val

isNil(undefined); // ?
isNil(null); // ?

由於 undefinednull 都是 falsy value,因此這種寫法也很常見。

不過這種寫法有個淺在的 bug,因為 false 0'' 也是 falsy value,所以可能誤判。

若你能確定永遠不可能有 false0'' 則可使用

null001

== null

let isNil = val => val == null

isNil(undefined); // ?
isNil(null); // ?

只要使用 == null 就可以同時判斷 undefinednull

注意是使用 == 的 lenient equality,並不是使用 === 的 strict equality。

這是為什麼呢 ?

因為在 ECMAScript 的 Spec 有這兩條規則:

null004

null003

既然如此,原本的 x === undefined || x === null 可以簡寫為 x == null

null002

Q : 這種寫法會被 Linter 擋下來吧 ?

經過測試,ESLint / WebStorm / Airbnb 三大 linter 都不會對 == null 寫法加以警告,很顯然這是一種默認 pattern,是少數 == 卻被 linter 接受寫法。

isNil()

import { isNil } from 'ramda';

isNil(undefined); // ?
isNil(null); // ?

Ramda 的 isNil() 會同時判斷 nullundefined,語意非常清楚。

isNil()
* -> Boolean
判斷是否為 nullundefined

null005

Conclusion

  • == null 動用了很深入的 ECMAScript 規則,大部分人都不知道,有可能寫了將來很難維護
  • Ramda 的 isNil() 算實務上最推薦的寫法,不只語意清楚,還一次判斷了 nullundefined
  • 若要連 empty value 也一起判斷,就同時使用 Ramda 的 isEmpty() && isNil()

Reference

ECMAScript Language Specification, The Abstract Equality Comparison Algorithm
Ramda, isNil()
Ramda, isEmpty()