2013-07-16 3 views
8

を渡されたかどうかをテストするためにメンテナンス可能JavaScriptはそれが言及:、それは使用するのはよくないですなぜ引数が本から

// Bad: Testing to see if an argument was passed 
function doSomething(arg1, arg2, arg3, arg4){ 
if (arg4 != null){ 
    doSomethingElse(); 
    } 
} 

が、私はここに!= nullを使用すると、非常に効果的であると感じ、それを濾過し、両方の引数が渡されなかった場合、またはヌルとして渡された場合

著者は、それが悪いと示唆する何らかの理由はありますか?

+4

著者は何を考えていたのでしょうか?著者に尋ねてください! –

+0

'null 'と引数を区別するのが便利なので、このアドバイスが提供されていると思います。 'undefined'は通常"値が与えられていない "を意味しますが、' null'は通常 "意図的に何の値も与えられません"を意味します。 – apsillers

+0

あなたが掲示したコードを持っているものの前のページに説明があります。 – j08691

答えて

8

!= nullは、undefinedの場合はfalse、基本的にはx !== null && x !== undefinedを意味します。 !=はタイプ強制を行い、その効果の1つはnullundefinedを等価(null == undefinedが真)として扱うことです。

あなたが望む場合を除き、!=null(またはundefined)を使用しないでください。

そして、あなたはコードが2つ(だけでなく実際には3つ)の可能性を防御することを非常におっしゃるとおり

  1. 何もすべてで引数のために渡されませんでした。

  2. nullを通過した。

  3. undefinedを渡した。それはnullまたはundefinedを渡してキャッチしていないので:

しかし、コメントは、それは引数が渡​​されたかどうかをテストするための悪い方法だし、それがあると言います。 (nullに合格し、のいずれかを入力しない場合は、が異なる場合があります)。必ずしも特定の関数の引数をチェックするのは悪い方法です。

-1

関数に何かを渡すことができるため、nullもあります。以下に、あなたが希望した場合:

var obj = new MyObject(); 
// ... 
obj = null; 
// ... 
doSomething(arg1, arg2, arg3, obj); 

あなたは、引数に合格しているだろうが、渡された参照がヌルあるので、あなたのチェックが失敗します。以下を必ずご使用ください:

if(typeof arg4 != 'undefined') 
    // ... 
+0

チェックが失敗するのはなぜですか?コードが 'null 'に対しても警戒するつもりであることは明らかです。 –

+0

公正であるためには、 'obj = undefined' *は引数を省略することと同じでなければなりません。 'null'と' undefined'の違いに対処する必要があります。 – apsillers

+0

@CrazyTrain元のコード例の著者は、あなたが 'null' *に気を付けない限り、'!= null'をチェックしないことを説明しようとしていました。 'null'に対するチェックは、コードの* defect *として(この場合)提供されます。実際の目的は、定義された引数の数をテストすることだけです。 – apsillers

0

確かに。 JavaScriptでnullの値とundefinedの値を持つことができます。そして彼らは同じではありません。

if (arg4)

そして、あなたはARG4を確認し、この方法は偽、未定義のヌルではないではない、とない:argが有効であるかどうかを確認するための迅速かつ簡単なアプローチはおそらくだろう。この最後の状態に注意してください。あなたは意識的に誤った値をここに伝えるかもしれません:-)

EDIT:T.J.クラウダーがここにあります。これを使うのは簡単ですが、ほとんどの場合はうまくいくでしょうが、注意してください。

+0

arg4がブール値でない限り、ベスト・アンサーです:) – EkoostikMartin

+6

* "argが有効かどうかを確認する最善の方法は、おそらく" * "いいえ、" "、" 0 "、" NaN " 'false'(' null'と 'undefined'に加えて)です。それはあなたをかむことが多い時があります。オプションの*オブジェクト*引数のための素晴らしいチェックですが、それ以外の場合、それは厄介です。 (私のDVDではない) –

関連する問題