2

現在、次のように定義された関数があります。

function a(b,c) {
 if (typeof(b) === "undefined") { b = 1; }
 if (typeof(c) === "undefined") { c = 2; }
 ...
}

以前は、値が偽の場合はデフォルトに設定されていました。これを変更すると、次の呼び出しが中断されます。

a(null, 3);

未定義のオブジェクトはありません。2 番目の引数だけを渡すにはどうすればよいですか?

実際には、未定義のオブジェクトがあります。

通常は未定義のオブジェクトがあるかもしれませんが、私の環境では明らかに何かがおかしい

4

3 に答える 3

4

実際には、次のundefinedオブジェクトがあります。

a(undefined, 3);

ただし、何らかの理由で変数であるため、誰かが行うことができます:

undefined = 2;

あなたのコードはもう機能しません。誰かが を再定義するのを防ぐundefinedには、次のようにします。

a(void 0 /* zero's not special; any value will do */, 3);

void置演算子は、値を取り、それを破棄して、 を返しますundefined

于 2013-01-12T04:20:36.780 に答える
3

変数の存在を確認するための良いテストは次のとおりです。

(typeof b === "undefined" || b === null)

したがって、関数は次のように書き直すことができます。

function a(b,c) {
   if (typeof(b) === "undefined" || b === null) { b = 1; }
   if (typeof(c) === "undefined" || b === null) { c = 2; }
   ...
}

これはundefined、 、nullまたはvoid 0引数として渡されるいずれかを説明します。それが繰り返される場合は、いつでもユーティリティ関数を定義できます。

function exists(obj) {
    return typeof(obj) === "undefined" || obj === null;
}

そして、この正確なテストは、Coffee-scriptがその存在演算子で行うもの?です。Coffee-script にはデフォルトの引数も用意されているため、作業がさらに簡単になります。

于 2013-01-12T04:21:22.107 に答える
0

未定義がないと言う理由がわかりません...

a(undefined, 3)

あなたが欲しいものです

于 2013-01-12T04:20:29.727 に答える