【问题标题】:What does while(i--) mean in javascript?javascript中的while(i--)是什么意思?
【发布时间】:2014-04-06 13:32:24
【问题描述】:

我正在使用来自swipejs.com 的 swipejs,主页滑块使用此逻辑来突出显示活动的无序列表元素,我想知道这个 while 条件是如何工作的。

<ul id="bullets">
   <li></li>
    ....
</ul>

var bullets = document.getElementById('bullets').getElementsByTagName('li');

var elem = document.getElementById('mySwipe');

window.mySwipe = Swipe(elem, {

callback: function(index, element) {
    var i = bullets.length;
    while (i--) {
      bullets[i].className = ' ';
    }
    bullets[index].className = 'on';
  }

});

【问题讨论】:

  • 表示如果(i = i - 1)大于0,则继续循环,否则退出
  • -- 是后减量。因此,您的 while 循环将运行,并且每次在评估 i 之后,它都会从中减去一个。当i 为零时,表达式将为假,循环将结束。
  • 到目前为止,还没有人解决递减操作的微妙之处。大多数人都暗示不会有 i = 0 的迭代,这是不正确的。
  • @Tmdean:由于这是函数的结尾,并且i 不再使用,所以它既不在这里也不在那里。另外,我相信 zzzzBov 确实解决了这个问题。
  • @Tmdean,我希望你没有引用我原来的答案,因为我最初是向后递减的。

标签: javascript html while-loop


【解决方案1】:

数字 0 在 JavaScript 中被认为是错误的,因此 while 循环将一直运行直到它达到 0。您必须确保 i 开始时是肯定的,否则您将获得一个无限循环。

【讨论】:

  • @Diodeus:我怀疑这种差异在绝大多数情况下都很明显,而且很明显,从问题来看,它的可读性较差。过早的优化等等。
  • @Diodeus 我什至看不出如何比较它们。如果您将for 循环更改为for (var i = 100; --i;) {},则可能看不到性能差异。如果您以正常方式使用for 循环,或更改while 循环以进行额外检查(如for 循环),那么它们的性能将再次具有可比性。
  • @Diodeus 几年前,while 循环的速度更快,但现代浏览器打破了这种缓慢。感谢浏览器工程师!
  • @MattBurland,应该是for (i--; i &gt;= 0; i--) {
【解决方案2】:

这意味着var i 正在递减,直到达到 0(或 Javascript 中为 false)

【讨论】:

    【解决方案3】:

    它将通过所有整数 is 向后迭代,因为 i-- 将递减 i (你可以做 i++ 递增,上升)(使其下降 1)所以当它达到 0 ,它将被视为false(所有数字除了0在转换为bool时都为真),从而停止循环。

    【讨论】:

      【解决方案4】:

      i-- 将 i 的值设置为比 i 小一。与 i++ 正好相反,i 加一。

      【讨论】:

        【解决方案5】:

        i--i++ 分别是 i = i - 1i = i + 1 的简写。

        因此,while 循环的工作方式如下:“while i = i - 1 不等于 0,bullets[i].className = ' ';”。

        【讨论】:

          【解决方案6】:

          i 在每个循环中都会减小(因为用户期望长度为正值)。

          因此,i 将在某个迭代中等于 0,而 0 在条件中类似于 false。

          【讨论】:

            【解决方案7】:
            var i = bullets.length;
            while (i--) {
                ...do stuff...
            }
            

            本质上等同于:

            var i = bullets.length;
            while (true) {
                if (i === 0) {
                    i = i - 1;
                    break;
                }
                i = i - 1;
                ...do stuff...
            }
            

            这种循环方式倾向于在性能非常重要的情况下使用,因为它比从0length-1 的迭代索引要快一些,并且实施起来相对简单。

            一般来说,除非您正在改善已知瓶颈并且已经验证它可以显着提高性能,否则您不应该使用它。

            【讨论】:

              【解决方案8】:

              它将首先检查i的值(如果不为零),然后在减少i之后进入循环。 所以,如果i = 10,循环将执行i = 9, i = 8, .., i = 0 然后退出 (因为在最后的i-- 检查中,i 在上一次循环运行中已经为零)

              【讨论】:

              • 这是最准确但最简洁的答案
              【解决方案9】:

              while (i--) { code(); }while (i &gt; 0) { code(); i--; }的简写

              【讨论】:

                猜你喜欢
                • 2014-01-12
                • 2016-01-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-11
                • 2019-06-25
                • 2015-09-18
                • 1970-01-01
                相关资源
                最近更新 更多