JavaScriptでのundefinedとnullの違い
はじめに
この記事はCODE BASE OKINAWA Advent Calendarの2022 17日目の記事です。
今年の4月から関わっている業務でTypeScriptを触っている中で、「nullじゃなくてundefinedが入っているよ〜」など怒られたりして修正しての繰り返しで、二つの違いを明確にしないまま、なんとなく過ごしてしまっていました。
しかし2022年も残り2週間程度で終わるので、今回のアドベントカレンダーを機に違いを明確にさせよう思います。
TypeScriptについて
TypeScriptとは、「型のあるjavascript」です。
TypeScriptで書かれたコードは純粋なJavaScriptにコンパイルされます。
なので今回はJavaScriptでのundefinedとnullの違いを確認していきます。
共通点
まず共通点は、「値がない」です。(予想はしていましたが、、、w)
相違点
では、今度は相違点です。
意味合いの違いで言うと下記になります。
-
undefined
-> 「値が代入されていないため、値がない」 -
null
-> 「代入すべき値が存在しないため、値がない」
null
は型づけられているのに値がないという事ですね。
次はそれぞれで確認していきます。
undefined
まずundefined
の特徴をあげます。
- 値が代入されていないため、値がない
-
undefined
は変数。なのでundefined
という変数を作成することもできる - プログラマーが明示的に使わなくても、自然に発生してくるもの
変数を宣言したときに初期値がなければJavaScriptはその変数にundefined
が代入されます。
let value;
console.log(value);
undefined
オブジェクトに存在しないプロパティ、配列にない要素にアクセスした時も自動的にundefined
const obj = {};
console.log(obj.foo);
undefined
const arr = [];
console.log(arr[0]);
undefined
戻り値がない関数の戻り値を取得した時もundefined
function func() {}
console.log(func());
undefined
null
以下null
の特徴です。
- 代入すべき値が存在しないため、値がない。
-
null
はリテラルなので、null
という変数を作成することはできない。 - プログラマーが意図的に使わない限り発生しない。
やはり、null
は意図的に型付けたりしないと発生されなさそうですね。
typeof演算子
JavaScriptのtypeof演算子を確認します。
undefined
->結果がプリミティブ名を指す"undefined"になる
null
->"null"ではなく"object"になる。
typeof undefined;
"undefined"
typeof null;
"object"
どのように使い分けるか
undefined
とnull
の使い分けをどうするかは大きなテーマになっているらしいです。
個人的には、undefined
が自然に発生するという事なのでundefined
を使っていく方が、ミスが減るのかなと思いました。他のことに注力をした方が良いのかと。しかし、所属する開発チームにおいてもルールは異なると思うのでその際は、そのルールに沿っていこうと思います。
こちらの記事には今回のundefined
とnull
の違いが細かく記載せれておりました。
終わりに
今回はJavaScriptのundefinedとnullの違いをまとめていきました。
これで、なんとなくundefined使ったり、null使ったりはしなくなるのではないかな。またエラーにぶち当たってもすんなり理解できるかと!
Discussion