私は次のコードに出くわしました:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
私はJavaScriptに少し慣れていますが、ここで読んできた他の質問から、このコードはあまり意味がないという印象を受けています。
typeof
以外のコンテキストで未定義の変数にアクセスするとエラーになります。
更新: 上記の(の引用)答えは誤解を招く可能性があります。 "未定義の変数"ではなく、"未宣言の変数"としてください。
私が見つけたように、 Ryan♦ による答えで、 メアリック 、および nwellnhof 関数に引数が与えられていなくても、引数に対するその変数は常に宣言されています。この事実は、以下のリストの最初の項目も間違っていることを証明しています。
私の理解から、以下のシナリオが経験されるかもしれません:
関数が引数なしで呼び出されたため、data
が未定義変数になり、data != null
でエラーが発生しました。
この関数は、引数としてnull
(またはundefined
)を指定して特に呼び出されました。この場合、data != null
は既に内部コードを保護しているため、&& data !== undefined
は無駄になります。
関数がnull以外の引数で呼び出されました。この場合、data != null
と data !== undefined
の両方がそのまま渡されます。
Q:私の理解は正しいですか?
私はFirefoxのコンソールで以下を試してみました。
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
私はdata !== undefined
の後 data != null
が役に立つかもしれないケースを理解することはできません。
“未定義の変数”は値undefined
とは異なります。
未定義の変数
var a;
alert(b); // ReferenceError: b is not defined
値がundefined
の変数。
var a;
alert(a); // Alerts “undefined”
関数が引数を取るとき、その引数がその値がundefined
であっても常に宣言されているので、エラーはありません。 != null
の後に!== undefined
が役に立たないというのは正しいことです。
JavaScriptでは、null
は「値なし」を通知するのに役立つ特別なシングルトンオブジェクトです。あなたは比較によってそれをテストすることができます、そしてJavaScriptでいつものように、混乱する型強制を避けるために===
演算子を使うのは良い習慣です:
var a = null;
alert(a === null); // true
@rynahが述べているように、 "未定義"はJavaScriptを少し混乱させます。ただし、 "x"が宣言された変数でなくても、typeof(x)
が "undefined"という文字列であるかどうかをテストするのは常に安全です。
alert(typeof(x) === 'undefined'); // true
また、変数が初期化されていない場合、変数は「未定義値」を持つことがあります。
var y;
alert(typeof(y) === 'undefined'); // true
まとめると、小切手は次のようになります。
if ((typeof(data) !== 'undefined') && (data !== null)) {
// ...
ただし、変数 "data"は正式な関数パラメータであるため常に定義されているため、 "typeof"演算子を使用する必要はなく、 "undefined value"と直接比較しても安全です。
function(data) {
if ((data !== undefined) && (data !== null)) {
// ...
このスニペットは、「定義されていてnullではない引数を使って関数が呼び出された場合」ということです。
Q: 関数が引数なしで呼び出されたため、dataが未定義変数になり、data!= nullでエラーが発生しました。
A: はい、data
は未定義に設定されます。仕様の セクション10.5宣言バインディングのインスタンス化 を参照してください。しかし、未定義の値にアクセスしてもエラーにはなりません。あなたはおそらくこれをエラーを発生させないstrictモードで宣言されていない変数にアクセスすることと混同しているでしょう。
Q: 引数としてnull(または未定義)を指定して関数が明示的に呼び出された。その場合、data!= nullは既に内部コードを保護しているため、&& data!==未定義となります。
Q: この関数はnull以外の引数で呼び出されました。この場合、data!= nullとdata!== undefinedの両方をそのまま渡すことになります。
A: 正しいです。以下のテストは同等です。
data != null
data != undefined
data !== null && data !== undefined
仕様の セクション11.9.3抽象等価比較アルゴリズム および セクション11.9.6厳密等価比較アルゴリズム を参照してください。
私は、あなたが期待していない値について変数をテストすることは一般的には良い考えではないと思います。あなたのテストは禁じられた値のブラックリストを書くこととして考えることができるので。しかし、あなたがすべての禁じられた値をリストするのを忘れるならば、どうですか?誰か、あなたでさえも、予期しない値を渡すことであなたのコードをクラックすることができます。したがって、より適切なアプローチはホワイトリストのようなものです - 予期された値に対してのみ変数をテストします。たとえば、データ値がこれではなく文字列であることが予想される場合は、次のようにします。
function (data) {
if (data != null && data !== undefined) {
// some code here
// but what if data === false?
// or data === '' - empty string?
}
}
このようなことをする:
function (data) {
if (typeof data === 'string' && data.length) {
// consume string here, it is here for sure
// cleaner, it is obvious what type you expect
// safer, less error prone due to implicit coercion
}
}
typeof foo === "undefined"
はfoo === undefined
とは異なり、混同しないでください。 typeof foo === "undefined"
はあなたが本当に必要なものです。また、!==
の代わりに!=
を使用してください。
したがって、ステートメントは次のように書くことができます。
function (data) {
if (typeof data !== "undefined" && data !== null) {
// some code here
}
}
編集:
宣言されていない変数にfoo === undefined
を使用することはできません。
var t1;
if(typeof t1 === "undefined")
{
alert("cp1");
}
if(t1 === undefined)
{
alert("cp2");
}
if(typeof t2 === "undefined")
{
alert("cp3");
}
if(t2 === undefined) // fails as t2 is never declared
{
alert("cp4");
}
テストを行う簡単な方法は以下のとおりです。
function (data) {
if (data) { // check if null, undefined, empty ...
// some code here
}
}
あなたの場合はdata==null
を使用してください(これはnullと未定義の場合のみ真です - 2番目の画像はnull/undefinedの行/列に焦点を当てています)
function test(data) {
if (data != null) {
console.log('Data: ', data);
}
}
test(); // the data=undefined
test(null); // the data=null
test(undefined); // the data=undefined
test(0);
test(false);
test('something');
ここにあなたはすべて( src )を持っています:
if の場合
== (その否定 != )
=== (その否定 !== )