“index >= 0 && count++”这个简写的意思是什么?

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++;

我从未见过类似的东西。我不知道它在做什么。


可能是JavaScript中(myVar && foo())的含义是什么?的重复问题。 - kabuko
3个回答

7
index >= 0 && count++;

第一部分: index >= 0

如果index的值大于或等于0,则返回true。

第二部分: 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风格的语言不同,它具有“真值”和“假值”的概念。如果一个值被评估为false0NaN""nullundefined,那么它是“假值”,所有其他值都是“真值”。

在JavaScript中,||&&运算符不返回布尔值,而是返回最后执行的操作数。

2 || 1将返回2,因为第一个操作数返回了一个“真值”,true或任何其他值都将始终返回true,因此不需要执行更多的操作。相反,null && 100将返回null,因为第一个操作数返回了一个“假值”。


1
我喜欢JavaScript中“||和&&”运算符不返回布尔值,而是返回最后执行的操作数的解释。谢谢! - LeOn - Han Li

6

这相当于:

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

&&是逻辑与运算符。如果index >= 0为真,则还会评估右侧部分,这会将count增加一。
如果index >= 0为假,则不会评估右侧部分,因此count不会变化。

另外,&&方法比if方法略快,可以在此 JSPerf中看到。


2
Google的闭包编译器还将大多数if语句转换为&&语句。就速度而言,在Firefox中只会稍微快一点。使用&&代替if仅仅是为了提高速度,不太可能获得任何速度上的改进。此外,请注意,JSLint会抱怨使用&&而不是if - Rob W
1
在这种情况下,我会像平常一样继续编码,让编译器来完成工作。最不想要的事情就是因为一个自己不太熟悉的代码而浪费几个小时去调试。 - ajax333221
1
请记住,这不仅仅是风格问题:使用“&&”语句表达式可以将结果分配或作为参数传递。 - grantwparks
1
@RobW修复"this JSPerf"的链接 -> 删除")"。 - Sid

4

这与以下内容相同:

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

JavaScript会先计算左侧(index >= 0),如果结果是false,则&& (AND)逻辑运算符将短路(因为false与任何东西的结果都是false),因此不会运行`count++`。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接