while(i--)在javascript中是什么意思?

while(i--)在javascript中是什么意思?,javascript,html,while-loop,Javascript,Html,While Loop,我使用的是swipejs from,主页滑块使用此逻辑突出显示活动的未排序列表元素,我想知道while条件是如何工作的 .... var-bullets=document.getElementById('bullets').getElementsByTagName('li'); var elem=document.getElementById('mysweep'); window.myswip=滑动(元素{ 回调:函数(索引、元素){ var i=长度; 而(我--){ 项目符号[i]。类

我使用的是swipejs from,主页滑块使用此逻辑突出显示活动的未排序列表元素,我想知道while条件是如何工作的

  • ....
var-bullets=document.getElementById('bullets').getElementsByTagName('li'); var elem=document.getElementById('mysweep'); window.myswip=滑动(元素{ 回调:函数(索引、元素){ var i=长度; 而(我--){ 项目符号[i]。类名=“”; } 项目符号[index].className='on'; } });
数字
0
在JavaScript中被认为是错误的,因此while循环将一直运行,直到达到0为止。首先,你必须确定我是正的,否则你会有一个无限循环

这意味着
变量i
将自身递减,直到它达到0(在Javascript中为false)

它将向后遍历所有整数
i
s,因为
i--
将递减
i
(你可以做
i++
来递增,向上)(使它向下1)所以当它达到0时,它将被视为
false
(除0以外的所有数字在转换为bool时均为true),从而停止循环。

i——将i的值设置为小于i的值。它与i++相反,i增加1。

i--
i++
分别是
i=i-1或
i=i+1的缩写


所以while循环是这样工作的:“
i=i-1
不等于0,
项目符号[i]。className='';

每个循环的
i
将减少(因为用户期望长度为正值)

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

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...
}
这种循环方式倾向于在性能非常重要的地方使用,因为它比将索引从
0
迭代到
length-1
稍微快一点,而且实现起来相对简单


一般来说,除非您正在改进一个已知的瓶颈,并且已经验证它在很大程度上提高了性能,否则不应该使用它。

它将首先检查
i
值(如果不是零),然后减小
i
后进入循环。 因此,如果
i
=10,循环将以
i
=9、
i
=8、…、
i
=0执行,然后退出 (因为在上一次
i--
检查中,
i
将从上一次循环运行中已经为零)

而(i--){code();}

是表示(i>0){code();i--;}

的缩写,意思是如果(i=i-1)大于0,则继续循环,否则退出--
是后减量。因此,您的
while
循环将运行,每次计算
i
后,它将从中减去一个。当
i
为零时,表达式将为false,循环将结束。到目前为止,还没有人解决后减量操作的微妙之处。大多数人都暗示不会有i=0的迭代,这是不正确的。@Tmdean:因为这是函数的结束,并且不再使用
i
,所以它既不在这里也不在那里。另外,我相信ZZBOV确实解决了这个问题。@Tmdean,我希望你不是在引用我的原始答案,因为我本来是把减量倒过来的。@Diodeus:我怀疑这种差异在绝大多数情况下都是明显的,显然,从这个问题上看,它的可读性较差。“过早的优化等等。”马特是我们这些铁杆程序员喜欢的。“当然,”迪奥德乌斯说,“我甚至不知道如何比较它们。如果将
for
循环更改为
for(var i=100;--i;){}
,则可能看不到性能差异。如果您以正常方式使用
for
循环,或者更改
while
循环以进行额外检查(如
for
循环),那么它们的性能将再次相当。@Diodeus几年前,while循环的速度更快,但现代浏览器却降低了这种速度。谢谢浏览器工程师们@MattBurland,应该是(i--;i>=0;i--){这是最准确但最简洁的答案
var i = bullets.length;
while (true) {
    if (i === 0) {
        i = i - 1;
        break;
    }
    i = i - 1;
    ...do stuff...
}