web-dev-qa-db-ja.com

JavaScriptの変数をnullで初期化するか、まったく初期化しないのはいつですか?

変数が宣言され、undefinedおよびnullに設定されているさまざまなコード例を見てきました。といった:

var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'

これらの宣言に従うコードがaまたはbに値を割り当てる場合、あるタイプの宣言を別のタイプの宣言に使用する理由は何ですか?

35
KMcA

最初の例は変数に何も割り当てないため、暗黙的にundefined値を参照します(詳細については、 10.5の仕様 を参照してください)。後で使用するために変数を宣言するときに一般的に使用されます。必要になる前に明示的に何かを割り当てる必要はありません。

2番目の例には、null(実際にはnull型ですが、JavaScript仕様の癖により、タイプ "object"を持っていると明示的に割り当てられています)。通常、既存の変数に既に保存されている値をクリアするために使用されます。 nullを上書きすることが可能であるため、値をクリアするときにundefinedを使用する方がより堅牢であると見なすことができ、その場合はundefinedを指定すると予期しない動作が発生します。

余談ですが、nullの癖は、より堅牢な形式の型チェックを使用する正当な理由です。

Object.prototype.toString.call(null); // Returns "[object Null]"
29
James Allardice

私は物事を行うための特定のより良い方法があるとは思わないが、私は可能な限り未定義を避ける傾向がある。たぶん、強力なOOPバックグラウンド。

JavascriptでOOPを模倣しようとすると、通常、変数を明示的に宣言し、nullに初期化します(OOPそれらを初期化しない場合、なぜ最初に宣言するのでしょうか?デバッグするときに、監視する変数の値を設定していない場合は、未定義として表示されます宣言したかどうか...

特定の動作のためにundefinedを保持することを好みます:

  • メソッドを呼び出すとき、指定しない引数は未定義の値になります。オプションの引数を持ち、引数が定義されていない場合に特定の動作を実装する良い方法。
  • 怠inなinit ...未定義は「初期化されていない:値を取得する」を意味し、nullは「初期化されたが値がnullだった(たとえば、サーバーエラーがあったかもしれない?)」
  • 配列:myArray [myKey] ===このキーにnull値がある場合はnull、このキーに値が設定されていない場合はundefined。

ただし、myVar == nullおよびmyVar == undefinedは、myVarが未定義であるか、nullであるかに関係なく、同じ値を返します。つかいます ===変数が未定義かどうかを知りたい場合。

10

私は質問を明確にするこのリンクを見ました。 JavaScriptで未定義の代わりにnullを使用する理由は何ですか?

Web開発者向けのJavascriptでは、「後でオブジェクトを保持するための変数を定義するときは、他の変数ではなくnullに初期化することをお勧めします。そのように、null値を明示的にチェックして、変数が後でオブジェクト参照で満たされました。」

9
KMcA

私は明示的にnullを選択し、IDが後で上書きされるオブジェクトを作成しないようにします。

var foo = {}; // empty object, has id etc.
var foo2 = null; // good practice, // filled with an object reference at a later time
var foo3;// undefined, I would avoid it
console.log(typeof foo);
console.log(typeof foo2);
console.log(typeof foo3);

nullを設定すると、データ型(オブジェクト)を識別するための読みやすさも確保されます。

object
object
undefined

ソース(Professional JavaScript for Web Developers 3rd Edition):

後でオブジェクトを保持することを意図した変数を定義する場合、他の変数ではなく変数をnullに初期化することをお勧めします。この方法では、値nullを明示的にチェックして、この例のように、変数が後でオブジェクト参照で満たされているかどうかを判断できます。

if (foo2 != null){
    //do something with foo2
}

値undefinedはnullの導関数であるため、ECMA-262はこれらを表面的には次のように定義します。

console.log(null == undefined); // prints true
console.log(null === undefined);// prints false
4
qrtLs

nullはオブジェクトです。何かが未定義の場合、それは何もありません。それはオブジェクトでも文字列でもありません。まだ定義されていないためです。

例:

Varで変数を宣言しますが、決して設定しません。

var foo; 
alert(foo); //undefined.

設定したことがないオブジェクトのプロパティにアクセスしようとしました。

var foo = {};
alert(foo.bar); //undefined

提供されなかった引数にアクセスしようとしました。

function myFunction (foo) {
  alert(foo); //undefined.
}
0
Dimser