🍎

null と undefinedは使い分けした方がいい?

に公開

はじめに

nullはその開発者から100億ドルの損害だと言われてるそうです。
https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare/
同じ値がないという意味なのにjavascript等では二つも用意されているのが不思議でこの際ちゃんと理解しようと思い調べました。
コードを書くときに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本体の開発ルールなので守る必要はないですが、参考にはなります。
https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#null-and-undefined

基本的にnullは使わない方がいい?

ここまでくるとnullは使わずにundefinedだけ使っていればいいという結論になりそうです。
ですが、例えばuseStateの中身を定義したくない時や戻り値で明確に値がないことを表現したいときは個人的にはnullの方がしっくりきます。
nullが構造上、自然発生しないので値にundefinedが入っている場合は即座にバグと分かるメリットがあるという意見もあります。
https://typescriptbook.jp/reference/values-types-variables/undefined-vs-null
こちらではundefinedは「値が代入されていないため、値がない」、nullは「代入すべき値が存在しないため、値がない」と記載されていますが、明示的に値がないことを表したい際はやはりnullが適しています。

結論: チームで統一 or 使い分け

そのため、もしチーム全体でルールを統一するならnullを使わずundefinedを使う。
ルールがないのであれば場面でnullを使う。ただし分岐には気を付ける。がしっくり来ました。
調べてもこれが正解!というものはなさそうです。。
どちらにせよ、nullとundefinedがどういう違いがあるのかを理解しておくのは大事ですね。

NCDCエンジニアブログ

Discussion