web-dev-qa-db-ja.com

JavaScriptのnullチェック

私は次のコードに出くわしました:

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 != nulldata !== 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が役に立つかもしれないケースを理解することはできません。

151
afsantos

“未定義の変数”は値undefinedとは異なります。

未定義の変数

var a;
alert(b); // ReferenceError: b is not defined

値がundefinedの変数。

var a;
alert(a); // Alerts “undefined”

関数が引数を取るとき、その引数がその値がundefinedであっても常に宣言されているので、エラーはありません。 != nullの後に!== undefinedが役に立たないというのは正しいことです。

102
Ry-

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ではない引数を使って関数が呼び出された場合」ということです。

78
maerics

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厳密等価比較アルゴリズム を参照してください。

7
nwellnhof

私は、あなたが期待していない値について変数をテストすることは一般的には良い考えではないと思います。あなたのテストは禁じられた値のブラックリストを書くこととして考えることができるので。しかし、あなたがすべての禁じられた値をリストするのを忘れるならば、どうですか?誰か、あなたでさえも、予期しない値を渡すことであなたのコードをクラックすることができます。したがって、より適切なアプローチはホワイトリストのようなものです - 予期された値に対してのみ変数をテストします。たとえば、データ値がこれではなく文字列であることが予想される場合は、次のようにします。

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
  } 
}
3
user6748331

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");
}
1
user2396441

テストを行う簡単な方法は以下のとおりです。

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}
1
Kadiri

あなたの場合は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 の場合

enter image description here

== (その否定 !=

enter image description here

=== (その否定 !==

enter image description here

1