【问题标题】:What does shorthand "index >= 0 && count++" do?速记“index >= 0 && count++”有什么作用?
【发布时间】:2012-03-08 08:39:34
【问题描述】:

我在阅读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 shorthand


【解决方案1】:
index >= 0 && count++;

第一部分:index &gt;= 0

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

第二部分:a &amp;&amp; b

大多数 C 风格的语言都使用布尔值 ||&amp;&amp; 运算符。

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

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

第三部分:count++

count++ 等价于count += 1 等价于count = count + 1

现在都在一起

如果该行的第一个操作数 (index &gt;= 0) 求值为 true,则第二个操作数 (count++) 将求值,因此它相当于:

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

JavaScript 细微差别

JavaScript 与其他 C 风格语言的不同之处在于它具有 truthyfalsey 值的概念。如果一个值的计算结果为false0NaN""nullundefined,则为falsey;所有其他值都是truthy

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

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

【讨论】:

  • 我喜欢|| and &amp;&amp; operators in JavaScript don't return boolean values, they return the last executed operand. 的解释。谢谢!
【解决方案2】:

相当于:

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

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

此外,&amp;&amp;if 方法快,如this JSPerf 所示。

【讨论】:

  • @ajax333221 Google 的闭包编译器也会在&amp;&amp; 语句中转换大多数if 结构。至于速度,它在 Firefox 中只是稍微快一点。当使用&amp;&amp; 而不是if 时,您不太可能在速度方面得到任何改进,只是为了速度。另请注意,JSLint 抱怨 &amp;&amp; 而不是 if
  • 在这种情况下,我会像以前一样继续编码,让编译器完成这项工作。我最不想做的就是调试几个小时,因为我不太熟悉的代码
  • 请记住,这不仅仅是风格问题:作为 && 语句的表达式允许将结果作为参数赋值或传递。
  • @RobW 修复“this JSPerf”的链接 -> 删除“)。”
【解决方案3】:

同理:

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

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

如果是 (index &gt;= 0) true,则计算右侧 (count++),然后忽略输出。

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多