14

他の誰かが書いたJavaScriptをデバッグしているときに、今まで見たことのないコードに出くわしました。サンプルは次のとおりです。

function doSomething() {
    //doing something here...
}

function doItNow() {
    //other logic...
    doSomething && doSomething();    // <=== What's this?
}

関数doItNow()の2行目の目的は、doSomethingが存在するかどうかを確認し、それを呼び出すことですか?そのようです:

function doItNow() {
    //other logic...
    if (doSomething) {
        doSomething();
    }
}

JSLintはそれが気に入らないので、アプリに悪いコードを入れたくありません。洞察はありますか?

4

3 に答える 3

7

まさに「略語」です。右側は、左側がif()ステートメントとして渡されたときにのみ実行されます。

Google Closure Compiler やその他のミニファイヤはこれを利用します。入力がif(a) a()の場合、結果は次のようになりますa&&a()


||たとえば、次のように同じことを行うことができます。

if( !a ){
  alert('Not a');
}

次のように書くことができます

a || alert('Not a');
于 2010-11-03T20:54:24.560 に答える
6

はい、あなたの2つの例は「同等」です。&&オペレーターは短絡評価を実行します。

最初のオペランドの式がの値 ( nullundefined0NaN空の文字列、そしてもちろんfalse) を生成する場合、2 番目のオペランドの式は評価され、値がtrueの場合、関数呼び出しが行われます。

ただし、doSomething宣言されていない場合、両方の例は失敗します。

宣言されていない識別子がコードで参照されている場合、次のようなReferenceError例外が発生します。

function foo() {
  undeclared && undeclared();
}

try {
  foo(); 
} catch (e) {
  alert(e);  // ReferenceError!
}

あなたがしたい場合は:

  1. 識別子が存在することを確認し、
  2. 呼び出し可能であることを確認してください

あなたはできる:

if (typeof doSomething == 'function') {
  doSomething();
}

typeof演算子は、存在しない識別子に対して安全に使用できます。さらに、それがdoSomething関数であることを確認することで、確実に呼び出すことができます。

于 2010-11-03T20:56:35.627 に答える
1

比較で関数 (または代入など) を呼び出すことは、一般に悪い考えです。人々は通常、比較に副作用があるとは考えていません。このケースは正当化できるほど単純ですが、誰かが規則を理解していない場合は、StackOverflow で質問する必要があるかもしれません ; )

于 2010-11-03T20:57:45.607 に答える