[解決済み] なぜJavaScriptには`null`という値があるのですか?
質問
JavaScriptでは、基本的に「私は存在しない」と言う値が2つあります。
undefined
と
null
.
プログラマが何も割り当てていないプロパティは
undefined
となりますが、あるプロパティが
null
,
null
は明示的に割り当てる必要があります。
が必要だと思ったことがあります。
null
というのも
undefined
はプリミティブ値であり
null
はオブジェクトです。そうではなく、たとえ
typeof null
がもたらすのは
'object'
: 実は、どちらもプリミティブな値で、つまりは
undefined
でもなく
null
はどちらも空のオブジェクトに変換されるため、コンストラクタ関数から返すことはできません(コンストラクタの失敗を宣言するためにエラーを投げる必要があります)。
また、これらは両方とも
false
と評価されます。私が思いつく唯一の違いは、一方が
NaN
と評価され、もう一方は
0
に変換されます。
では、なぜ両方の
undefined
と
null
を誤ってチェックしているプログラマーを混乱させるだけであれば
null
をチェックするプログラマーを混乱させるだけなのでしょうか?
私が知りたいのは、誰かが合理的な例を持っていて、その例では
null
を使って表現できないような
undefined
を使って表現できなかったものです。
ということで、一般的なコンセンサスは次のようなものだと思われます。
undefined
は「そのようなプロパティはない」という意味であり
null
は「そのプロパティは存在するが、値を保持していない」ことを意味します。
JavaScript の実装が実際にこの動作を強制するのであれば、私はそれを受け入れることができます - しかし
undefined
は完全に有効なプリミティブ値なので、この契約を破るために既存のプロパティに簡単に代入することができます。したがって、あるプロパティが存在するかどうかを確認したい場合、そのプロパティに
in
演算子か
hasOwnProperty()
といった具合です。では、もう一度言います。
undefined
と
null
?
私は実際に
undefined
にしたくないプロパティの値を解除したいときに使います。
delete
. を使うべきでしょうか?
null
を使うべきでしょうか?
どのように解決するのですか?
この問題は、「なぜ JS に null 値があるのか」ということではなく、ほとんどの言語で何らかの null 値があり、一般に非常に有用であると考えられています。
疑問は、「なぜ 未定義 の値があるのか、ということです。使用されている主な場所
-
を宣言したとき
var x;
を宣言しているが、代入していない場合。x
は未定義を保持します。 - 関数が宣言したよりも少ない数の引数を取得したとき。
- 存在しないオブジェクトのプロパティにアクセスしたとき。
null
は確かに(1)と(2)*と同じように動作したことでしょう。(3) は本当はすぐに例外を投げるべきで、そうしないということは、この奇妙な
undefined
を返さないという事実は、デバッグを困難にする大きな原因です。
*: (2)は例外を投げるべきだと主張することもできますが、その場合はデフォルト/変数引数のためのより良い、より明示的なメカニズムを提供しなければならないでしょう。
しかし、JavaScriptはもともと例外を持たず、オブジェクトが特定の名前のメンバーを持っているかどうかを尋ねる方法もありませんでした - 唯一の方法は、メンバーにアクセスし、何が得られるかを見ることでした(そして時には今も)。そのため
null
がすでに目的を持っていて、それにメンバを設定したいと思うかもしれないことを考えると、別の帯域外値が必要でした。そこで、私たちは
undefined
がありますが、これはご指摘のように問題があり、私たちが決して取り除くことのできない、もうひとつの素晴らしい JavaScript の「機能」です。
私は実際に、もう使用されていないが削除したくないプロパティの値を設定解除したいときに、undefinedを使用しています。代わりに null を使用するべきですか?
はい、そうです。キープ
undefined
を、他の言語が代わりに例外を投げるかもしれないときのシグナリングのための特別な値として保持します。
null
の方が一般に優れていますが、一部の IE の DOM インターフェイスでは
null
というエラーになることがあります。この場合、空文字列を設定するとうまくいくことが多いようです。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] Promise : then vs then + catch [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptのnullとundefinedの違いは何ですか?
-
[解決済み】NULLのない言語についての最適な説明
-
[解決済み] JavaScriptでundefinedの代わりにnullを使用する理由は何ですか?
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?