nullとundefinedの違い
TypeScript
undefined
初期化されていない
ただなにもない
code:ts
let hoge; // これはundefinedになる
null
現在利用できないことを示す
強い意志を持って、返すものがないぞ、と明示している感じ
あまり気にしていない
自分で型を書く時は基本的にnullを使っている
?の扱いが変わる
JSを無視して、普通に考えるなら、nullに統一するほうが自然
というか、他の言語にはundefinedに相当するものがないのでそれが自然になる
エンジニアリング的には undefined は未初期化、メンバーの省略、引数の省略、null条件演算子によって《自然発生》するモノであって、代入や戻り値で明示的に指定する値に使うべきモノではない、と言うのが模範解答になるかと。 undefined で統一しておいた方が都合がいいってのは良くも悪くもハック。
既出意見ですが自分も、undefinedは自然発生するもの、nullは明示的に使用するもの、としていますね。サブシステムからnullが紛れ込むこともあるので、アプリ層開発において禁止するメリットが思いつきません。
JavaScriptはともかく、TypeScriptはもうnullはないものとして全部undefinedに寄せる方が構文のサポートも多いし便利な気がしてる。==が残る唯一のユースケースの==nullも考えなくても良くなる
僕はnullに寄せる派で、理由は「存在しないキーを読んだ場合にはundefinedが返ってくるので、nullではなくundefinedになってたら どっかにバグがあると分かる」からなんですね。あと単にnullの方が文字数節約できる
差異はあまり気にせずに、もし統一するならundefinedじゃないかという気がする
これは、TSの他のものと相性が良いから、という理由しか無い
{a?: string}な型は、アクセスするとstring|undefinedになる
これは自然発生的に生まれたもの
そこで明示的に定義した関数function(a: string|null)に、そのまま渡せなくて面倒になる
最初から、明示的に定義したものもfunction(a: string|undefined)としておけば困らない
となる
nullとundefinedで異なる挙動をするものを知っておきたい
だから、stringifyするとundefinedが消える
https://gyazo.com/107a060e6374e6670b12e7ca77be24ef
typeofの結果が違う
https://gyazo.com/b3a52deae297ccf47ce516c1bea4f141
でもまあ、ts上でこの辺の型のものをtypeofで出し分けることはないし、そこまで気にする必要はない
基本if (hoge == null)で判定するので、そこに差異はない
Number
https://gyazo.com/ee5756f4f7c5c426bf3f5bfec2045c08
tsでこんなアホな書き方をすることがないので気にする必要はなさそう
というか、こういうの列挙してても意味ないなmrsekut.icon
もっとts寄りのものを考えないといけない
undefinedの誕生
code:ts
// つまり以下のように書く状況はありえない?
let hoge = undefined;
// これはありうる
let hoge = null;
以下のような状況ではどちらが適切?
プロフィール項目にTwitterアカウントを登録できる任意項目
書いてもいいし、書かなくてもいい
この時のデータ型はどうなるか
code:ts
twitter: string; // "mrsekut" or "" 個人的にはこれは論外
twitter: string | undefined // "mrsekut" or undefined
twitter: string | null // "mrsekut" or null
参考
TypeScriptチームはnullを使わないらしい
undefinedだけを使う