web-dev-qa-db-ja.com

JavaScriptで正確に未定義とはどういう意味ですか?なぜそこにあるのですか?それはどのような使用法ですか?それはどのように役立つでしょうか?

JavaScriptにはndefinedと呼ばれるものがあります。基本クラスなのか、組み込み変数なのか、キーワードなのか、他に何なのかわからないので、私は何か言いました。私はそれがそこにあることを知っています。

実際の動作を確認するには、次のように書くだけです。

undefined;
typeof undefined;

thingがJavaScriptに挿入された理由を誰かに説明してもらえますか?この言語にはnullの値があるため、nullのような値にすることはできません。他の言語では、プロパティや変数の値がわからない場合は、単にnullに設定します。ここでも同じことができます。

JavaScriptでこれをどのように使用できるか?

11
Saeed Neamati

未定義について理解する必要のあることが2つあります...

  • typeundefinedのみを持つことができます1つの値
  • 変数undefined

以下を注意深く読んでください...

  • タイプnumberには非常に多くの値があります(10、10.01、1e1)。ただし、タイプundefinedの-​​1つの値その値は変数undefinedに格納されます。 その値にはリテラル表現がありません-たとえば、数値11001e-1はすべて数値型のリテラルですが、変数undefinedに格納されている値はリテラル形式ではありません。

  • undefinedは、JavaScriptがグローバルスコープでundefined型の値を宣言して割り当てる変数であり、通常の変数です。したがって、次のすべてを行うことができます...

 typeof undefined; // "undefined" 
 
 undefined = 100; 
 typeof undefined; // "number" 
 
 undefined = void 0; 
 typeof undefined; // "undefined" 
 
 window.undefined === undefined; // true 
 window.undefined === void 0; // true 
 
  • 変数undefinedを使用したくない場合は、式void 0によって型undefinedの値を生成できます。その唯一の目的は、型の値を返すことです。 undefined

...これがJavaScriptに挿入された理由を誰かに説明してもらえますか...

番号。宣言されていない変数がローカルではなくグローバルスコープに入る理由を誰も説明できないように。あなたはそれが存在することの正当性を見つけようとする代わりに、それをsmartly使用するように訓練する必要があります。

... null値があります...

nullundefinedが行うことを実行できますが、スカラーではなくobjectsに関連しています。実際、JavaScriptはnull自体をオブジェクトと見なします-typeof nullは「オブジェクト」を返します。

私の意見では、一番下の行はundefinednullの絶対的な目的を推論しようとせず、コードでそれらをわかりやすく使用して、コードを読み取り、保守、再利用できるようにすることです。

13
treecoder

古い質問に答えて申し訳ありませんが、未定義とnullの両方が必要な理由は簡単です。プロトタイプベースのダックタイピング言語では、 しなければならない 「このオブジェクトはXの値を定義しない」と「このオブジェクトはXが何もない/ null /空である」と区別します。

この機能がないと、プロトタイプチェーンをたどる方法がないため、継承は機能しません。 obj.somePropが未定義であることを確認できるようにする必要があります。これにより、obj.prototype.somePropを確認し、値が見つかるまでチェーンを上に向かって進むことができます。 obj.somePropがnullを返した場合、それが本当にnullであったのか、それとも単に「プロトタイプを見る」ことを意味していたのかを知る方法はありません。これを回避する唯一の他の方法は、プロトタイプチェーンでファズしたり、JSブラックマジックの他のさまざまなビットを実行したりする能力を壊す、舞台裏にいくつかの不器用な魔法を注入することです。

多くのJavascriptと同様に、undefinedとnullの考え方は、最初は不安定で愚かであり、その後絶対に見事です(それから、不安定で愚かですが、合理的な説明があります)。

存在しないプロパティにアクセスすると、C#などの言語はコンパイルされません。他の動的言語は、存在しないプロパティに触れると、実行時に例外をスローすることがよくあります。つまり、特別な構成を使用してそれらをテストする必要があります。プラスクラスとは、オブジェクトがインスタンス化されたときに、その継承チェーンとそのすべてのプロパティがわかっていることを意味します。JSでは、プロトタイプを15ステップ上に変更すると、それらの変更が既存のオブジェクトに反映されます。

6
russbishop

未定義の値に設定されているグローバル変数undefinedがあります。邪悪な人々はそれを別のものに設定するかもしれないので、それを信頼しないことがおそらく最善です。

  • 未定義値は、値を返さない関数の戻り値です。
  • 未定義の値は、割り当てられていない変数の値です。
  • 未定義の値は、渡されていないパラメーターの値です。
  • 未定義の値は、割り当てられていないプロパティの値です。
  • 'undefined'は、宣言されていない変数のタイプです。 (typeof undeclaredVariable == 'undefined'。不完全な変数の値を読み取ろうとすると、ReferenceErrorがスローされます。)

nulltypeof null == 'object'のため、微妙に壊れています。なぜundefinednullがあるのか​​わかりません。おそらく歴史的な事故でしょう。

3
Sean McMillan

まあ、undefinedは、-nothingを表すために正確に定義された値であるnullとは対照的に、-未定義であるものを評価することによって得られるセンチネル値です。

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

したがって、たとえば、戻り値を定義しない関数の戻り値は未定義です。オブジェクトで定義されていないプロパティの値は未定義です。式ではないステートメントの戻り値は未定義です(ただし、これはコンソール以外では発生しません)。
canは明示的にundefinedを返す関数を作成し、canはオブジェクトにundefinedの値を持つプロパティを明示的に定義することに注意してください。最終的には有効な値です。あなたが明示的に通信するためにそうすることは、何かが未定義であることです。

undefinednullの関係は、NaN0の関係と考えることができます。

2
back2dos