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 风格的语言都简化了布尔值||&&运算符。

对于一个||操作,你只需要知道第一个操作数是true,整个操作都会返回true

对于一个&&操作,你只需要知道第一个操作数是false,整个操作都会返回false

第三方:count++

count++相当于count += 1相当于count = count + 1

现在都在一起了

如果该index >= 0行的第一个操作数 ( ) 计算为true,则第二个操作数 ( count++) 将计算,因此它相当于:

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

JavaScript 的细微差别

JavaScript 与其他 C 风格语言的不同之处在于它具有的概念truthyfalsey值。如果一个值的计算结果为false, 0, NaN, "", null, 或undefined, 它是falsey; 所有其他值为truthy.

||JavaScript 中的和&&运算符不返回布尔值,它们返回最后执行的操作数。

2 || 1将返回2,因为第一个操作数返回了一个truthy值,true否则任何其他操作都将始终返回 true,因此无需执行更多操作。或者,null && 100将返回,null因为第一个操作数返回了一个falsey值。

于 2012-02-16T22:25:18.500 回答
6

它相当于:

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

&&是逻辑 AND 运算符。如果index >= 0为真,则还评估正确的部分,它增加count一。
如果index >= 0为假,则不对右侧部分进行评估,因此count不会更改。

此外,正如在此 JSPerf中所见,比该&&方法快。if

于 2012-02-16T22:15:38.087 回答
4

它与以下内容相同:

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

JavaScript 将评估左侧 ( index >= 0),如果false&&(AND) 将短路(因为 false AND 任何内容都为 false),因此不运行 `count++.

如果它是 ( index >= 0) true,它评估右侧 ( count++),然后它只是忽略输出。

于 2012-02-16T22:15:44.737 回答