ローカル変数の場合、localVar === undefined
ローカルスコープ内のどこかで定義されている必要があるか、ローカルとは見なされないため、でのチェックは機能します。
ローカルではなく、どこにも定義されていない変数の場合、チェックsomeVar === undefined
は例外をスローします:Uncaught ReferenceError:j is not defined
ここに私が上に言っていることを明確にするいくつかのコードがあります。さらに明確にするために、インラインコメントに注意してください。
function f (x) {
if (x === undefined) console.log('x is undefined [x === undefined].');
else console.log('x is not undefined [x === undefined.]');
if (typeof(x) === 'undefined') console.log('x is undefined [typeof(x) === \'undefined\'].');
else console.log('x is not undefined [typeof(x) === \'undefined\'].');
// This will throw exception because what the hell is j? It is nowhere to be found.
try
{
if (j === undefined) console.log('j is undefined [j === undefined].');
else console.log('j is not undefined [j === undefined].');
}
catch(e){console.log('Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.');}
// However this will not throw exception
if (typeof j === 'undefined') console.log('j is undefined (typeof(x) === \'undefined\'). We can use this check even though j is nowhere to be found in our source code and it will not throw.');
else console.log('j is not undefined [typeof(x) === \'undefined\'].');
};
上記のコードを次のように呼び出すと、
f();
出力は次のようになります。
x is undefined [x === undefined].
x is undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
上記のコードを次のように呼び出す場合(実際には任意の値を使用):
f(null);
f(1);
出力は次のようになります。
x is not undefined [x === undefined].
x is not undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.
次のようなチェックを行うと、typeof x === 'undefined'
本質的にこれを求めています。ソースコードのどこかに変数x
が存在する(定義されている)かどうかを確認してください。(多かれ少なかれ)。C#またはJavaを知っている場合、このタイプのチェックは行われません。存在しない場合はコンパイルされないためです。
<==フィドルミー==>