1. ホーム
  2. javascript

[解決済み] なぜJavaScriptには`null`という値があるのですか?

2022-08-24 15:34:57

質問

JavaScriptでは、基本的に「私は存在しない」と言う値が2つあります。 undefinednull .

プログラマが何も割り当てていないプロパティは undefined となりますが、あるプロパティが null , null は明示的に割り当てる必要があります。

が必要だと思ったことがあります。 null というのも undefined はプリミティブ値であり null はオブジェクトです。そうではなく、たとえ typeof null がもたらすのは 'object' : 実は、どちらもプリミティブな値で、つまりは undefined でもなく null はどちらも空のオブジェクトに変換されるため、コンストラクタ関数から返すことはできません(コンストラクタの失敗を宣言するためにエラーを投げる必要があります)。

また、これらは両方とも false と評価されます。私が思いつく唯一の違いは、一方が NaN と評価され、もう一方は 0 に変換されます。

では、なぜ両方の undefinednull を誤ってチェックしているプログラマーを混乱させるだけであれば null をチェックするプログラマーを混乱させるだけなのでしょうか?

私が知りたいのは、誰かが合理的な例を持っていて、その例では null を使って表現できないような undefined を使って表現できなかったものです。

ということで、一般的なコンセンサスは次のようなものだと思われます。 undefined は「そのようなプロパティはない」という意味であり null は「そのプロパティは存在するが、値を保持していない」ことを意味します。

JavaScript の実装が実際にこの動作を強制するのであれば、私はそれを受け入れることができます - しかし undefined は完全に有効なプリミティブ値なので、この契約を破るために既存のプロパティに簡単に代入することができます。したがって、あるプロパティが存在するかどうかを確認したい場合、そのプロパティに in 演算子か hasOwnProperty() といった具合です。では、もう一度言います。 undefinednull ?

私は実際に undefined にしたくないプロパティの値を解除したいときに使います。 delete . を使うべきでしょうか? null を使うべきでしょうか?

どのように解決するのですか?

この問題は、「なぜ JS に null 値があるのか」ということではなく、ほとんどの言語で何らかの null 値があり、一般に非常に有用であると考えられています。

疑問は、「なぜ 未定義 の値があるのか、ということです。使用されている主な場所

  1. を宣言したとき var x; を宣言しているが、代入していない場合。 x は未定義を保持します。
  2. 関数が宣言したよりも少ない数の引数を取得したとき。
  3. 存在しないオブジェクトのプロパティにアクセスしたとき。

null は確かに(1)と(2)*と同じように動作したことでしょう。(3) は本当はすぐに例外を投げるべきで、そうしないということは、この奇妙な undefined を返さないという事実は、デバッグを困難にする大きな原因です。

*: (2)は例外を投げるべきだと主張することもできますが、その場合はデフォルト/変数引数のためのより良い、より明示的なメカニズムを提供しなければならないでしょう。

しかし、JavaScriptはもともと例外を持たず、オブジェクトが特定の名前のメンバーを持っているかどうかを尋ねる方法もありませんでした - 唯一の方法は、メンバーにアクセスし、何が得られるかを見ることでした(そして時には今も)。そのため null がすでに目的を持っていて、それにメンバを設定したいと思うかもしれないことを考えると、別の帯域外値が必要でした。そこで、私たちは undefined がありますが、これはご指摘のように問題があり、私たちが決して取り除くことのできない、もうひとつの素晴らしい JavaScript の「機能」です。

私は実際に、もう使用されていないが削除したくないプロパティの値を設定解除したいときに、undefinedを使用しています。代わりに null を使用するべきですか?

はい、そうです。キープ undefined を、他の言語が代わりに例外を投げるかもしれないときのシグナリングのための特別な値として保持します。

null の方が一般に優れていますが、一部の IE の DOM インターフェイスでは null というエラーになることがあります。この場合、空文字列を設定するとうまくいくことが多いようです。