while(i--)在javascript中是什么意思?
我使用的是swipejs from,主页滑块使用此逻辑突出显示活动的未排序列表元素,我想知道while条件是如何工作的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]。类
....
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...
}