null と undefinedは使い分けした方がいい?
はじめに
nullはその開発者から100億ドルの損害だと言われてるそうです。
コードを書くときにtext===undefinedやtext===nullなどで、曖昧なコードが増えるのも問題です。
nullは自然発生しない
例えば以下のようなコードがあった時、コンソールにはundefinedが表示されます。
配列の空の要素を参照した時や、戻り値のない関数の戻り値を取る時もundefinedです。
let value;
console.log(value);
// undefined
このようにundefinedはコードで指定しなくても自然発生しますが、nullは基本的に自然発生しないです。
そのため、開発側が定義する値も、自然発生する可能性のあるundefinedに合わせる方がいいかもしれません。
またTypeScriptの開発wikiには「Use undefined. Do not use null.」とあります。
ただページ上部に今すぐ見るのをやめろと書いてあり、実際にこれはTypeScriptを使った開発のルールでなく、TypeScript本体の開発ルールなので守る必要はないですが、参考にはなります。
基本的にnullは使わない方がいい?
ここまでくるとnullは使わずにundefinedだけ使っていればいいという結論になりそうです。
ですが、例えばuseStateの中身を定義したくない時や戻り値で明確に値がないことを表現したいときは個人的にはnullの方がしっくりきます。
nullが構造上、自然発生しないので値にundefinedが入っている場合は即座にバグと分かるメリットがあるという意見もあります。
こちらではundefinedは「値が代入されていないため、値がない」、nullは「代入すべき値が存在しないため、値がない」と記載されていますが、明示的に値がないことを表したい際はやはりnullが適しています。
結論: チームで統一 or 使い分け
そのため、もしチーム全体でルールを統一するならnullを使わずundefinedを使う。
ルールがないのであれば場面でnullを使う。ただし分岐には気を付ける。がしっくり来ました。
調べてもこれが正解!というものはなさそうです。。
どちらにせよ、nullとundefinedがどういう違いがあるのかを理解しておくのは大事ですね。

NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion