3

underscore.string関数を読んで時間をつぶしていたとき、この奇妙な速記を見つけました。

function count (str, substr) {
  var count = 0, index;
  for (var i = 0; i < str.length;) {
    index = str.indexOf(substr, i);
    index >= 0 && count++; //what is this line doing?
    i = i + (index >= 0 ? index : 0) + substr.length;
  }
  return count;
}

法律: underscore.stringのクレジットを表示せずに上記の関数を使用する前によく考えてください。


私はここに行だけを置いたので、あなたはそれを見つけるのに時間を無駄にしません:

index >= 0 && count++;

私はそれに似たものを見たことがありません。私は何をしているのか分かりません。

4

3 に答える 3

7
index >= 0 && count++;

最初の部分:index >= 0

index以上の値がある場合はtrueを返します0

第二部:a && b

ほとんどのCスタイルの言語は、ブール値||&&演算子をショートカットします。

演算の場合、最初のオペランドがであり、演算全体がを返すこと||を知っている必要があるだけです。truetrue

演算の場合、最初のオペランドがであり、演算全体がを返すこと&&を知っている必要があるだけです。falsefalse

三分の一:count++

count++と同等とcount += 1同等count = count + 1

今一緒に

行の最初のオペランド(index >= 0)がと評価されるtrue場合、2番目のオペランド(count++)は評価されるため、次のようになります。

if (index >= 0) {
  count = count + 1;
}

JavaScriptのニュアンス

truthyJavaScriptは、概念とfalsey値を持っているという点で他のCスタイルの言語とは異なります。値が、、、、、、、またはと評価された場合false、それは0;です。他のすべての値はです。NaN""nullundefinedfalseytruthy

||JavaScriptの&&演算子はブール値を返さず、最後に実行されたオペランドを返します。

2 || 12最初のオペランドがtruthy値を返したために返されtrueます。そうでない場合は常にtrueが返されるため、これ以上操作を実行する必要はありません。または、最初のオペランドが値null && 100を返したために戻ります。nullfalsey

于 2012-02-16T22:25:18.500 に答える
6

それは以下と同等です:

if (index >= 0) {
    count = count + 1;
}

&&論理 AND 演算子です。が true の場合index >= 0、右側の部分も評価され、1 増加countします。
が false の場合index >= 0、右の部分は評価されないため、count変更されません。

また、この JSPerfに見られるように、 は メソッドより&&わずかに高速です。if

于 2012-02-16T22:15:38.087 に答える
4

以下と同じです:

if(index >= 0){
    count++;
}

JavaScript は左側 ( index >= 0)を評価しfalse&&(AND) が短絡する場合 (AND が false であるため)、`count++ を実行しません。

( index >= 0)の場合true、右側 ( count++) を評価し、出力を無視します。

于 2012-02-16T22:15:44.737 に答える