nullとundefinedの違い
TypeScript
undefined
初期化されていない
ただなにもない
tslet 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が消える
typeof
の結果が違う
でもまあ、ts上でこの辺の型のものをtypeofで出し分けることはないし、そこまで気にする必要はない
基本 if (hoge == null)
で判定するので、そこに差異はない
Number
tsでこんなアホな書き方をすることがないので気にする必要はなさそう
というか、こういうの列挙してても意味ないな

もっとts寄りのものを考えないといけない
undefinedの誕生
ts// つまり以下のように書く状況はありえない?
let hoge = undefined;
// これはありうる
let hoge = null;
以下のような状況ではどちらが適切?
プロフィール項目にTwitterアカウントを登録できる任意項目
書いてもいいし、書かなくてもいい
この時のデータ型はどうなるか
tstwitter: string; // "mrsekut" or "" 個人的にはこれは論外
twitter: string | undefined // "mrsekut" or undefined
twitter: string | null // "mrsekut" or null
参考
TypeScriptチームはnullを使わないらしい
undefinedだけを使う