変数が宣言され、undefinedおよびnullに設定されているさまざまなコード例を見てきました。といった:
var a; // undefined - unintentional value, object of type 'undefined'
var b = null; // null - deliberate non-value, object of type 'object'
これらの宣言に従うコードがaまたはbに値を割り当てる場合、あるタイプの宣言を別のタイプの宣言に使用する理由は何ですか?
最初の例は変数に何も割り当てないため、暗黙的にundefined
値を参照します(詳細については、 10.5の仕様 を参照してください)。後で使用するために変数を宣言するときに一般的に使用されます。必要になる前に明示的に何かを割り当てる必要はありません。
2番目の例には、null
(実際にはnull
型ですが、JavaScript仕様の癖により、タイプ "object"を持っていると明示的に割り当てられています)。通常、既存の変数に既に保存されている値をクリアするために使用されます。 null
を上書きすることが可能であるため、値をクリアするときにundefined
を使用する方がより堅牢であると見なすことができ、その場合はundefined
を指定すると予期しない動作が発生します。
余談ですが、null
の癖は、より堅牢な形式の型チェックを使用する正当な理由です。
Object.prototype.toString.call(null); // Returns "[object Null]"
私は物事を行うための特定のより良い方法があるとは思わないが、私は可能な限り未定義を避ける傾向がある。たぶん、強力なOOPバックグラウンド。
JavascriptでOOPを模倣しようとすると、通常、変数を明示的に宣言し、nullに初期化します(OOPそれらを初期化しない場合、なぜ最初に宣言するのでしょうか?デバッグするときに、監視する変数の値を設定していない場合は、未定義として表示されます宣言したかどうか...
特定の動作のためにundefined
を保持することを好みます:
ただし、myVar == null
およびmyVar == undefined
は、myVarが未定義であるか、nullであるかに関係なく、同じ値を返します。つかいます ===
変数が未定義かどうかを知りたい場合。
私は質問を明確にするこのリンクを見ました。 JavaScriptで未定義の代わりにnullを使用する理由は何ですか?
Web開発者向けのJavascriptでは、「後でオブジェクトを保持するための変数を定義するときは、他の変数ではなくnullに初期化することをお勧めします。そのように、null値を明示的にチェックして、変数が後でオブジェクト参照で満たされました。」
私は明示的に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
nullはオブジェクトです。何かが未定義の場合、それは何もありません。それはオブジェクトでも文字列でもありません。まだ定義されていないためです。
例:
Varで変数を宣言しますが、決して設定しません。
var foo;
alert(foo); //undefined.
設定したことがないオブジェクトのプロパティにアクセスしようとしました。
var foo = {};
alert(foo.bar); //undefined
提供されなかった引数にアクセスしようとしました。
function myFunction (foo) {
alert(foo); //undefined.
}