undefinedとnullのみを検出したい時があると思います。
そんな場合は、以下のシンプルな条件式で解決します。
value == null
この式では、valueがnullかundefinedだった場合のみtrueとなり、0や’0’やfalse、空文字列などは全てfalseが返ります。
等価演算子 (==) – JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Equality
オペランドの一方が
nullまたはundefinedである場合、もう一方もnullまたはundefinedであればtrueを返します。それ以外の場合はfalseを返します。
引用によればundefinedによって比較してもよさそうに感じます。
value == undefined
しかしながら、これはESLintなどでは禁止されています。
no-undefined – ESLint – プラグイン可能なJavaScriptリンター
https://eslint.org/docs/latest/rules/no-undefined
何故undefinedを識別子として使用してはいけないか
端的に言うと、undefinedがjavascriptの予約語として登録されていないからです。
予約語として登録されていないと、以下のようなことができてしまいます。
字句文法 – JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Lexical_grammar#%E4%BA%88%E7%B4%84%E8%AA%9E
const shadowUndefined = () => {
const undefined = 'shadowed'
console.log(undefined) // shadowed
let x
console.log(x == undefined) // false
}
予約語として登録されているnullでは、上記のようなことは起こりません(エラーが発生します)。
また、古のjavascriptではグローバル変数であるundefinedすら上書き可能でした。
window.undefined = 1 // !!?
// undefined === 1
昔からjavascriptを触っているおじさん達は、undefinedを識別子として使用することが禁忌という意識が、なんとなく意識の底にあったように思います。
Undefinedのみを検出したいときはどうするか
typeofを使用するのが最も安全です。
typeof value === 'undefined'
typeof演算子は、値の型がなんであるかを返します。
これであればグローバル及びローカル変数であるundefinedがどうなっていても判定することが可能です。
また、そもそも対象の変数が宣言されていなくても、エラーになることがありません。
undefined – JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/undefined
……とはいえ、宣言されていない変数をチェック機会がそれほどあるか。またundefinedなる変数を宣言する機会がどれくらいあるかを考えると、現代のjavascriptではundefinedを直接識別子に叩き込むことも少なくないようですね。
value === undefined
おじさんたちを苦い顔にさせたい皆さんは、この手法を使ってみましょう。
まとめ
undefinedとnullを検出したい時は
value == null
undefinedのみを検出したい時は
typeof value === 'undefined'
をそれぞれ使用しましょう。