2

私はちょうどこのJSコードを試していました -

if(a){
    console.log("a IS DEFINED")
} else {
    console.log("a IS UNDEFINED")
}

エラーが発生しています-

ReferenceError: a is not defined

しかし、追加するvar aと印刷されますa IS UNDEFINED

var a;
if(a){
    console.log("a IS DEFINED")
} else {
    console.log("a IS UNDEFINED")
}

// prints a IS UNDEFINED

どちらの場合も動作が異なるのはなぜaですかundefined?

4

3 に答える 3

5

あなたの混乱は完全に理解できます。それは、「未定義」という言葉の 2 つの異なる使用法です。

未定義の識別子,の間には違いがありますundefined

あなたがするとき

if (a)

...識別子の値を取得しようとしていますaその識別子をまったく定義していない場合は、ReferenceError. aJavaScript エンジンは、何を意味するのかまったくわかりません。

対照的に、これは:

var a;

識別子を (変数として)定義し、初期値を与えますundefined。それで、あなたがするとき

if (a)

...JavaScript エンジンは、あなたが話していることを知っています。つまり、変数に行き、aその値を取得します。

何らかの理由で識別子が定義されているかどうかを知る必要があり、エラーをキャッチしたくない場合は、未定義の識別子の型を取ることができます。

if (typeof a === "undefined")

aが完全に未定義であっても、(エラーなしで) 機能します。ただし、2 つのもの (未定義の識別子と、値を持つ定義済みの識別子) を区別しませんundefined


さて、これで十分に混乱しないかのように、「ルーズ モード」では、JavaScript は非常に奇妙な動作をします。私は「暗黙のグローバルの恐怖」と呼んでます。 a 、新しいグローバル変数を作成します。ありがたいことに、今では ES5 の「厳密モード」があり、これにより、常にそうあるべきエラーが発生します。:-)ReferenceError

于 2013-10-18T08:50:25.773 に答える
0

使用することをお勧めします:

if (typeof a === 'undefined') {
    console.log('a IS UNDEFINED');
} else {
    console.log('a IS DEFINED');
}

undefined値がない場合、または以前に宣言されていない場合、変数の型はです。

于 2013-10-18T08:52:14.323 に答える
0

つまり、変数を宣言せずにコード内で使用すると、指している変数を参照できないため、 ReferenceError が発生します。しかし、変数を宣言しても初期化しないと、値は定義されていません。

例 :

最初のケース:

if(j){
    //do something
}

jを宣言していませんでしたが、それを参照しているため、 j宣言済み/既知の変数として取得していないため、未定義のエラーが発生します。

2番目のケース:

var j;
if(j){
    //do something
}

ここでj==nulltrueになりますが、 jnullであるためではなく、 if(j) は if(false) と同じ if(null) と同等になります。むしろjundefined だからです。

于 2013-10-18T08:54:54.383 に答える